目录

装饰器模式(Decorator)

装饰器模式 VS 静态代理模式


装饰器模式(Decorator)

1、动态地给一个对象增加一些额外的职责,就增加的功能来说,Decorator 模式相比生成子类更加灵活。

2、要求装饰对象(如下所示的 Decorator)和被装饰对象(如下所示的 Source)实现同一个接口(如下所示的 Sourceable),装饰对象持有被装饰对象的实例,通过构造器传入。

3、装饰器模式的应用场景:

1)需要扩展一个类的功能。

2)动态的为一个对象增加功能,而且还能动态撤销。(继承不能做到这一点,继承的功能是静态的,不能动态增删。)

缺点:产生过多相似的对象,不易排错!多层装饰比较复杂

装饰器模式关系图

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)相关推荐

  1. python中的装饰器、装饰器模式_python 设计模式之装饰器模式 Decorator Pattern

    #写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...

  2. python 设计模式之装饰器模式 Decorator Pattern

    #写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...

  3. (设计模式七)java设计模式之装饰器模式

    一.简介: 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装.这种模式创建了一个装饰类 ...

  4. java设计模式之 装饰器模式

    装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构. 这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装 ...

  5. java设计模式之装饰器模式

    一.装饰器模式简介 装饰器模式可以动态给一个对象添加一些额外的职责,同时又不改变其结构.就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活.这种模式创建了一个装饰 ...

  6. Java 设计模式之装饰器模式

    装饰器模式用于给原有对象增加新功能的场景, 拿食物冰淇淋,香草巧克力作为例子,给冰淇淋加香草,或者加巧克力,或者加香草和巧克力. 首先定义一个食物接口: /*** 装饰类和被装饰类共同继承的抽象类* ...

  7. java设计模式之装饰器模式(包装器模式)

    显然设计模式往往追求开闭原则,所以往往是面向接口编程,那么万事万物就是先写接口,把需求弄出来,这里以一辆车子在陆地上跑为基础,对它进行装饰,使它可以具备更多的"功能",达到装饰的效 ...

  8. decorator java_装饰器模式-Decorator(Java实现)

    装饰器模式-Decorator(Java实现) 装饰器模式允许向一个现有的对象添加新的功能, 同时又不改变其结构. 其中 "现有对象"在本文中是StringDisplay类. 添加 ...

  9. 设计模式学习----装饰器模式

    这两天本来是自在学习java collection Framework的Fail Fast底层机制,看到核心的部分时,突然意识到设计模式的问题,上大学到现在我还没有真正理解过设计模式的概念,于是用了大 ...

  10. c语言装饰,C/C++知识点之装饰器模式(Decorator) C++

    本文主要向大家介绍了 C/C++知识点之装饰器模式(Decorator) C++,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助.装饰器模式是比较常用的一种设计模式,Python中就 ...

最新文章

  1. 将moss 2007的模板文件导入到moss 2010
  2. 【转】Linux 之 /etc/profile、~/.bash_profile 等几个文件的执行过程
  3. hp 交换机远程连接_光收发器怎么安装,光纤收发器连接示意图解
  4. oracelp---随意 记录(nvl)
  5. java实验四 集合与函数式编程实验
  6. FFmpeg资料来源简单分析:libswscale的sws_getContext()
  7. css改变谷歌浏览器的滚动条样式
  8. Java 并发 —— Thread、Executor、线程池
  9. java与c++比较
  10. Base16,Base32,Base64编码的介绍
  11. 利用 Maxima 求解常微分方程
  12. 《东周列国志》第七十三回 伍员吹箫乞吴市 专诸进炙刺王僚
  13. AJAX框架简笔画图片教程,jquery 框架使用教程 AJAX篇
  14. 快速构建一个简单的对话+问答AI (上)
  15. Tiled创建六边形地图
  16. 考虑碳交易机制的园区综合能源系统电热协同运行优化研究(Matlab代码实现)
  17. FY4A数据读取与插值
  18. 学习别人的方法,借鉴
  19. 【离散数学】数理逻辑 第一章 命题逻辑(4) 联结词的完备集
  20. 对于动态“内存”分配,Have you explored?(C语言)

热门文章

  1. 内容编辑器在MOSS中的应用
  2. wince6.0 OK6410 启动NandFlash路径下的程序快捷键
  3. 使用SQL的全文搜索功能构建 Web 搜索应用程序
  4. java流意外结束_java – POI – null之后的文件意外结束
  5. Java线程池的学习记录
  6. mysql二进制包安装mysql_基于linux使用mysql二进制包安装mysql
  7. xgboost算法详解
  8. python将嵌套列表转换为字典
  9. grep命令--文件过滤分割与合并
  10. GitHub网站项目下载速度过慢、下载失败问题成功解决