Java 设计模式 之 装饰器模式(Decorator)
目录
装饰器模式(Decorator)
装饰器模式 VS 静态代理模式
装饰器模式(Decorator)
1、动态地给一个对象增加一些额外的职责,就增加的功能来说,Decorator 模式相比生成子类更加灵活。
2、要求装饰对象(如下所示的 Decorator)和被装饰对象(如下所示的 Source)实现同一个接口(如下所示的 Sourceable),装饰对象持有被装饰对象的实例,通过构造器传入。
3、装饰器模式的应用场景:
1)需要扩展一个类的功能。
2)动态的为一个对象增加功能,而且还能动态撤销。(继承不能做到这一点,继承的功能是静态的,不能动态增删。)
缺点:产生过多相似的对象,不易排错!多层装饰比较复杂
![](/assets/blank.gif)
3、下面使用代码实现上图:
package main.decoratorModel;/*** Created by Administrator on 2019/4/9 0009.* 源接口*/
public interface Sourceable {//加法public void addition(float a, float b);//乘法public void multiplication(float a, float b);
}
package main.decoratorModel;import java.util.logging.Logger;/*** Created by Administrator on 2019/4/9 0009.* 计算器*/
public class Calculator implements Sourceable {@Overridepublic void addition(float a, float b) {Logger logger = Logger.getAnonymousLogger();logger.info(a + " + " + b + " = " + (a + b));}@Overridepublic void multiplication(float a, float b) {Logger logger = Logger.getAnonymousLogger();logger.info(a + " * " + b + " = " + (a * b));}
}
package main.decoratorModel;import java.util.logging.Logger;/*** Created by Administrator on 2019/4/9 0009.* 装饰器为在不改动 Source 的基础上,为 Source 对象动态的增加新的功能*/
public class Decorator implements Sourceable {private Calculator calculator;//将被装饰的对象通过参数传入public Decorator(Calculator calculator) {this.calculator = calculator;}@Overridepublic void addition(float a, float b) {Logger logger = Logger.getAnonymousLogger();logger.info("操作加法前的新功能...");calculator.addition(a, b);logger.info("操作加法后的新功能...");}@Overridepublic void multiplication(float a, float b) {Logger logger = Logger.getAnonymousLogger();logger.info("用户准备进行乘法运算:" + a + " * " + b);calculator.multiplication(a, b);logger.info("用户准备进行乘法运算完毕");}
}
4、测试如下:
package main.test;import main.decoratorModel.Calculator;
import main.decoratorModel.Decorator;
import main.decoratorModel.Sourceable;import java.util.logging.Logger;/*** Created by Administrator on 2019/4/8 0008.*/
public class Test {public static void main(String[] args) {Sourceable sourceable_calculator = new Calculator();sourceable_calculator.addition(10F, 30F);sourceable_calculator.multiplication(20F, 50F);Logger logger = Logger.getAnonymousLogger();logger.info("********************************************************");Sourceable sourceable_decorator = new Decorator(new Calculator());sourceable_decorator.addition(30F, 60F);sourceable_decorator.multiplication(25F, 30F);}
}
装饰器模式 VS 静态代理模式
1、装饰器模式与静态代理模式如果不仔细区分,则很容易混淆。区别的主要思想是:代理模式是控制控制访问,而装饰器模式是新增行为
2、相同点:
1)被装饰类与装饰类要求实现同一接口;静态代理类与目标类也要求实现同一接口
2)装饰类与静态代理类都可以实现增强目标类的功能
3)装饰类与静态代理类中都具有目标类的引用,目的都是为了在其中调用目标类的方 法
3、不同点
1)装饰器设计模式就是为了增强目标类;静态代理设计模式是为了保护和隐藏目标对象, 让客户类只能访问代理对象,而不能直接访问目标对象。
2)装饰类中的目标类的引用是通过带参构造器传入的;静态代理类中的目标类的引用, 一般都是在代理类中直接创建的,目的就是为了隐藏目标对象。
3)装饰类通常会先使用一个抽象类作为基类,基类一般不对目标对象进行增强,而是由不同的具体装饰类继承抽象装饰类后进行增强,这些具体的装饰者可以形成增强链,对目标对象进行连续增强。静态代理类会直接对目标对象进行增强,需要哪些增强的功能,一次性在静态代理类中完成,没有增强链的概念。
可以参考:http://www.runoob.com/design-pattern/decorator-pattern.html
Java 设计模式 之 装饰器模式(Decorator)相关推荐
- python中的装饰器、装饰器模式_python 设计模式之装饰器模式 Decorator Pattern
#写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...
- python 设计模式之装饰器模式 Decorator Pattern
#写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...
- (设计模式七)java设计模式之装饰器模式
一.简介: 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装.这种模式创建了一个装饰类 ...
- java设计模式之 装饰器模式
装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构. 这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装 ...
- java设计模式之装饰器模式
一.装饰器模式简介 装饰器模式可以动态给一个对象添加一些额外的职责,同时又不改变其结构.就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活.这种模式创建了一个装饰 ...
- Java 设计模式之装饰器模式
装饰器模式用于给原有对象增加新功能的场景, 拿食物冰淇淋,香草巧克力作为例子,给冰淇淋加香草,或者加巧克力,或者加香草和巧克力. 首先定义一个食物接口: /*** 装饰类和被装饰类共同继承的抽象类* ...
- java设计模式之装饰器模式(包装器模式)
显然设计模式往往追求开闭原则,所以往往是面向接口编程,那么万事万物就是先写接口,把需求弄出来,这里以一辆车子在陆地上跑为基础,对它进行装饰,使它可以具备更多的"功能",达到装饰的效 ...
- decorator java_装饰器模式-Decorator(Java实现)
装饰器模式-Decorator(Java实现) 装饰器模式允许向一个现有的对象添加新的功能, 同时又不改变其结构. 其中 "现有对象"在本文中是StringDisplay类. 添加 ...
- 设计模式学习----装饰器模式
这两天本来是自在学习java collection Framework的Fail Fast底层机制,看到核心的部分时,突然意识到设计模式的问题,上大学到现在我还没有真正理解过设计模式的概念,于是用了大 ...
- c语言装饰,C/C++知识点之装饰器模式(Decorator) C++
本文主要向大家介绍了 C/C++知识点之装饰器模式(Decorator) C++,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助.装饰器模式是比较常用的一种设计模式,Python中就 ...
最新文章
- 将moss 2007的模板文件导入到moss 2010
- 【转】Linux 之 /etc/profile、~/.bash_profile 等几个文件的执行过程
- hp 交换机远程连接_光收发器怎么安装,光纤收发器连接示意图解
- oracelp---随意 记录(nvl)
- java实验四 集合与函数式编程实验
- FFmpeg资料来源简单分析:libswscale的sws_getContext()
- css改变谷歌浏览器的滚动条样式
- Java 并发 —— Thread、Executor、线程池
- java与c++比较
- Base16,Base32,Base64编码的介绍
- 利用 Maxima 求解常微分方程
- 《东周列国志》第七十三回 伍员吹箫乞吴市 专诸进炙刺王僚
- AJAX框架简笔画图片教程,jquery 框架使用教程 AJAX篇
- 快速构建一个简单的对话+问答AI (上)
- Tiled创建六边形地图
- 考虑碳交易机制的园区综合能源系统电热协同运行优化研究(Matlab代码实现)
- FY4A数据读取与插值
- 学习别人的方法,借鉴
- 【离散数学】数理逻辑 第一章 命题逻辑(4) 联结词的完备集
- 对于动态“内存”分配,Have you explored?(C语言)