装饰者模式

装饰者模式的实现有两个要求:
1.装饰者类与目标类要实现相同的借口,或者继承自相同的抽象类。
2.装饰者类中要有目标类的引用作为成员变量,具体的赋值一般通过带参构造器完成。

按着这两个要求我们进行类的编写。

目标类:

//接口
package com.wk.decorator;public interface IMyService {String sayHello();
}
//实现类
package com.wk.decorator;public class IMyServiceImpl implements IMyService {@Overridepublic String sayHello() {return "hello";}}

装饰者基类

package com.wk.decorator;//装饰者基类:不对目标类进行增强 ,无参构造,目标对象引用
public class DecoratorBase implements IMyService {protected IMyService target;public DecoratorBase() {super();}public DecoratorBase(IMyService target) {this.target = target;}@Overridepublic String sayHello() {//调用目标方法 不增强。return target.sayHello();}}

具体装饰者类

//具体装饰者类1
package com.wk.decorator;
//具体装饰类:继承基类,单一增强。有参构造。
public class WhoSay extends DecoratorBase {public WhoSay(IMyService target) {super(target);}//重写基类业务方法 增强。
    @Overridepublic String sayHello() {return "Jack say " +super.sayHello();}
}
//具体装饰者类2
package com.wk.decorator;public class toWho extends DecoratorBase {public toWho(IMyService target) {super(target);}@Overridepublic String sayHello() {// TODO Auto-generated method stubreturn super.sayHello()+" to Tom";}
}

测试:

package com.wk.decorator;public class Test {public static void main(String[] args) {//创建目标对象
        IMyService target=new IMyServiceImpl();
        //使用目标对象作为参数,创建装饰者类
        IMyService who=new WhoSay(target);
        
        String one=who.sayHello();
        System.out.println(one);
        //将第一次增强的结果作为第二次增强的参数出现,形成“装饰者链”
        IMyService towho=new toWho(who);
        
        String two=towho.sayHello();
        System.out.println(two);} }

测试结果:

Jack say hello
Jack say hello to Tom

 看完装饰者模式你是不是想到了静态代理模式。觉得两者之间有点相似。若是你能有如此想法,那么不妨读一下本博文的静态代理模式。具体讲解两者的相同点与不同点。

转载于:https://www.cnblogs.com/wangyanei2017/p/9213813.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/266850.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

子弹类

import pygame # pygame2d游戏 import time from pygame.locals import *class HeroPlane(object):def __init__(self,screen_temp):self.x210self.y700self.screenscreen_tempself.image pygame.image.load("./feiji/hero1.png")self.bullet_list[]def display(sel…

Shell中的特殊字符

通配符 当需要用命令处理一组文件,例如file1.txt、file2.txt、file3.txt……,用 户不必一一输入文件名,可以使用Shell通配符。Shell命令的通配符含义如下表 引号 在 Shell 中引号分为 2 种:单引号、双引号。 ( 1 &…

树莓派换源、vim更新:树莓派更换国内可用镜像源

参考:树莓派vim更新:树莓派更换国内可用镜像源 作者:丶PURSUING 发布时间:2021-02-01 22:40:48 网址:https://blog.csdn.net/weixin_44742824/article/details/113530423?spm1001.2014.3001.5502 Ubuntu18.04换源更新…

android的帧布局,七、Android帧布局FrameLayout和霓虹灯效果

帧布局容器为每个加入其中的组件创建一个空白的区域(称为一帧),所有每个子组件占据一帧,这些帧都会根据gravity属性执行自动对齐。FrameLayout的常用XML属性和相关方法XML属性相关方法说  明android:foregroundsetForeground(Drawable)设置该帧布局容器…

flutter能开发游戏吗_Steam上架游戏开发软件,不用代码也能制作游戏,而且还是免费的...

时代在变化,科技在进步,曾几何时我们一度以为的高科技,在现在看来也不过是平常到不能再平常的东西。游戏开发也一样,以前需要代码才能开发制作而成,现如今都不需要了,直接编辑就OK,Steam商城这次…

Flask之flask-session

简介 flask-session是flask框架的session组件,由于原来flask内置session使用签名cookie保存,该组件则将支持session保存到多个地方,如: redis:保存数据的一种工具,五大类型。非关系型数据库memcachedfilesy…

快速构建Windows 8风格应用10-设备方向

本篇博文主要介绍常用支持Windows 8操作系统设备的方向、如何获取当前设备方向、DisplayProperties类 常用支持Windows 8操作系统设备的方向在我们常用的设备当中,Windows 8是通过什么来监控设备方向呢?答案是方向传感器,那么对于设备的不同方…

android viewpager fragment传值,Android开发中如何解决Fragment +Viewpager滑动页面重复加载的问题...

前言之前在做一个Viewpager上面加载多个Fragment时总会实例化已经创建好的Fragmnet对象类似viewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {Overridepublic Fragment getItem(int position) {switch(position){case 0:fragmentsnew Fragmnet01(…

CSDN怎么转载别人的博客

参考:CSDN怎么转载别人的博客 作者:zhongjianblackberry 发布时间:2018-03-06 11:57:59 网址:https://blog.csdn.net/zhongjianblackberry/article/details/79456338 目录转载CSDN博客步骤:Markdown和HTML相关小知识Ma…

青岛西海岸惠普大数据_青岛西海岸新区用好卫星大数据 为城市治理全面赋能...

来源:环球网为推进城市治理数字化程度,提升城市治理的智能化和精细化水平,青岛西海岸新区搭建了人工智能搜索视觉分析平台,以月度更新的频率,汇聚了新区0.5米高分辨率卫星影像数据,通过数据资源共享系统为各…

总结jenkins Android自动打包遇到的坑

一、ndk-build报错 [roothejianlai-jenkins LearnGradle]# ndk-build /usr/local/android-ndk-r8/ndk-build: /usr/local/android-ndk-r8/prebuilt/linux-x86/bin/make: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory 解决方法:安装glibc.i6…

微博VS微信,谁更有移动优势

微博、微信,一个是中国互联网的明星,一个是中国互联网的后起之秀,前者出身于中国最大的门户网站新浪,后者出身于中国最大的即时通讯公司腾讯。作为各自公司在移动互联网上的主推产品,两者都背负着公司的巨大期望。那么…

android的热修复,Android热修复原理

热修复框架技术主要有三类,代码修复,资源修复,动态链接库修复。资源修复很多资源修复的框架参考了Instant Run资源修复的原理,所以先了解一下Instant RunInstant RunInstant Run是Android Studio 2.0以后新增的一个运行机制&#…

树莓派的四种登陆方式

参考:树莓派的4种登陆方式 作者:丶PURSUING 发布时间:2021-02-02 09:15:30 网址:https://blog.csdn.net/weixin_44742824/article/details/113524929?spm1001.2014.3001.5502 目录一、HDMI视频线二、串口1.修改sd卡中的系统文件2…

丰收互联蓝牙key怎么开机_ublox收购Rigado的蓝牙模块业务,扩大蓝牙低功耗产品组合...

全球领先的定位与无线通讯技术供应商u-blox 宣布,已与 Rigado签署资产购买协议,收购其蓝牙模块业务。Rigado是商业物联网Edge-as-a-Service(EaaS)边缘即服务网关解决方案的领先供应商,于2015年开始提供通过认证的无线模块。强化蓝牙产品系列此…

字符串类型str方法

首字母大写 temp rttty ret temp.capitalize() print(ret) 内容居中 temp kfkjdfj ret temp.center(21,*) ###内容居中,两边空白处可以用任意符号填充 print(ret) 子序列个数 temp ‘retegg is hh’ ret temp.count(g) #计算字符串中的出现的个数 print(re…

好的编程风格

1。关键字 if, while, for 后有一个空格 2。号之类的双目运算符两侧都有空格 3。后缀运算符和操作数之间不加空格 例如 s.a , foo(argu) , a[i] 4。, 号和 ; 号之后要加空格&#xff0c;例如 foo(argu1, argu2) for (i0; i<20; i) 5。关于双目运算符两侧加空格可以灵活规定&…

android 时间戳 时区,三句话理解时区与时间戳

从不浪费时间的人&#xff0c;没有工夫抱怨时间不够。 —— 杰弗逊第一句话&#xff1a;时间戳时间不分东西南北、在地球的每一个角落都是相同的。他们都有一个相同的名字&#xff0c;叫时间戳。时间戳 指的就是Unix时间戳(Unix timestamp)。它也被称为Unix时间(Unix time)、PO…

windows下的diskpart指令彻底格式化清除U盘

参考&#xff1a;windows下的diskpart指令修复U盘分区 作者&#xff1a;丶PURSUING 发布时间&#xff1a;2021-02-02 09:38:55 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/113537038?spm1001.2014.3001.5501 参考&#xff1a;原文链接 作者&…

简述控制反转ioc_讲一下你理解的 DI 、IoC、DIP ?

作者 | 木小楠链接 |cnblogs.com/liuhaorain/p/3747470.html摘要面向对象设计(OOD)有助于我们开发出高性能、易扩展以及易复用的程序。其中&#xff0c;OOD有一个重要的思想那就是依赖倒置原则(DIP)&#xff0c;并由此引申出IoC、DI以及Ioc容器等概念。本文我们将一起学习这些概…