`

思考装饰模式

阅读更多

1:装饰模式的本质
        装饰模式的本质:动态组合
        动态是手段,组合才是目的。这里的组合有两个意思,一个是动态功能的组合,也就是动态进行装饰器的组合;另外一个是指对象组合,通过对象组合来实现为被装饰对象透明的增加功能。
        但是要注意,装饰模式不仅仅可以增加功能,也可以控制功能的访问,可以完全实现新的功能,还可以控制装饰的功能是在被装饰功能之前还是之后来运行等。
        总之,装饰模式是通过把复杂功能简单化,分散化,然后在运行期间,根据需要来动态组合的这么一个模式。

2:何时选用装饰模式
       建议在如下情况中,选用装饰模式:

  • 如果需要在不影响其它对象的情况下,以动态、透明的方式给对象添加职责,可以使用装饰模式,这几乎就是装饰模式的主要功能
  • 如果不合适使用子类来进行扩展的时候,可以考虑使用装饰模式,因为装饰模式是使用的“对象组合”的方式。所谓不适合用子类扩展的方式,比如:扩展功能需要的子类太多,造成子类数目呈爆炸性增长。

 
相关模式

  • 装饰模式与适配器模式
        这是两个没有什么关联的模式,放到一起来说,是因为它们有一个共同的别名:Wrapper。
        这两个模式功能上是不一样的,适配器模式是用来改变接口的,而装饰模式是用来改变对象功能的。
  • 装饰模式与组合模式
        这两个模式有相似之处,都涉及到对象的递归调用,从某个角度来说,可以把装饰看成是只有一个组件的组合。
        但是它们的目的完全不一样,装饰模式是要动态的给对象增加功能;而组合模式是想要管理组合对象和叶子对象,为它们提供一个一致的操作接口给客户端,方便客户端的使用。
  • 装饰模式与策略模式
        这两个模式可以组合使用。
        策略模式也可以实现动态的改变对象的功能,但是策略模式只是一层选择,也就是根据策略选择一下具体的实现类而已。而装饰模式不是一层,而是递归调用,无数层都可以,只要组合好装饰器的对象组合,那就可以依次调用下去,所以装饰模式会更灵活。
        而且策略模式改变的是原始对象的功能,不像装饰模式,后面一个装饰器,改变的是经过前一个装饰器装饰过后的对象,也就是策略模式改变的是对象的内核,而装饰模式改变的是对象的外壳。
        这两个模式可以组合使用,可以在一个具体的装饰器里面使用策略模式,来选择更具体的实现方式。比如前面计算奖金的另外一个问题就是参与计算的基数不同,奖金的计算方式也是不同的。举例来说:假设张三和李四参与同一个奖金的计算,张三的销售总额是2万元,而李四的销售额是8万元,它们的计算公式是不一样的,假设奖金的计算规则是,销售额在5万以下,统一3%,而5万以上,5万内是4%,超过部分是6%。
        参与同一个奖金的计算,这就意味着可以使用同一个装饰器,但是在装饰器的内部,不同条件下计算公式不一样,那么怎么选择具体的实现策略呢?自然使用策略模式就好了,也就是装饰模式和策略模式组合来使用。
  • 装饰模式与模板方法模式
        这是两个功能上有相似点的模式。
        模板方法模式主要应用在算法骨架固定的情况,那么要是算法步骤不固定呢,也就是一个相对动态的算法步骤,就可以使用装饰模式了,因为在使用装饰模式的时候,进行装饰器的组装,其实也相当于是一个调用算法步骤的组装,相当于是一个动态的算法骨架。
        既然装饰模式可以实现动态的算法步骤的组装和调用,那么把这些算法步骤固定下来,那就是模板方法模式实现的功能了,因此装饰模式可以模拟实现模板方法模式的功能。
        但是请注意,仅仅只是可以模拟功能而已,两个模式的设计目的、原本的功能、本质思想等都是不一样的。
分享到:
评论

相关推荐

    .NET中的设计模式——一步步发现装饰模式

    前言过去我的一个朋友常说,学习...装饰器模式允许我们动态为对象添加行为。下面我们先介绍一个场景,然后寻找替代方法。这会帮助我们认清该模式的真实用途,尤其在灵活性这方面。思考过程今天我们参考的不是一个实际的

    [Java设计模式(第2版)(Design.Patterns.in.Java).John.Metsker

    全书给出了大量的练习,作为对读者的挑战,以启发思考,督促读者通过实践练习的方式来掌握设计模式。同时,作者又给出了这些练习的参考答案,使读者可以印证比较,找出自己的不足,提高设计技能。 《java设计模式(第...

    设计模式 GOF 23

    ”)的应用经验和体验后,你将用一种非同寻常的方式思考面向对象设计。你将拥有一种深刻的洞察力,以帮助你设计出更加灵活的、模块化的、可复用的和易理解的软件—这也是你为何着迷于面向对象技术的源动力,不是吗?...

    设计模式:可复用面向对象软件的基础--详细书签版

     我们并不认为这组设计模式是完整的和一成不变的,它只是我们目前对设计的思考的记录。因此我们欢迎广大读者的批评与指正,无论从书中采用的实例、参考,还是我们遗漏的已知应用,或应该包含的设计模式等方面。你...

    Head.First设计模式_PDF.part1

    3 装饰者模式:装饰对象 4 工厂模式:烘烤OO的精华 5 单件模式:独一无二的对象 6 命令模式:封装调用 7 适配器模式与外观模式:随遇而安 8 模板方法模式:封装算法 9 送代器与组合模式:管理良好的...

    javascript-Design-Patterns:设计模式

    本文为《 JavaScripti计模式与开发实践》一书的学习与思考。 基础知识 设计模式 创建型模式:封装创建对象的变化 封装new构造函数 对象池 结构型模式:封装对象之间的组合关系 utils;统一兼容接口 代理拦截;缓存...

    asp.net知识库

    DbHelperV2 - Teddy的通用数据库访问组件设计和思考 也论该不该在项目中使用存储过程代替SQL语句 如何使数据库中的表更有弹性,更易于扩展 存储过程——天使还是魔鬼 如何获取MSSQLServer,Oracel,Access中的数据字典...

    精通并发与netty视频教程(2018)视频教程

    32_IO体系架构系统回顾与装饰模式的具体应用 33_Java NIO深入详解与体系分析 34_Buffer中各重要状态属性的含义与关系图解 35_Java NIO核心类源码解读与分析 36_文件通道用法详解 37_Buffer深入详解 38_NIO堆外内存与...

    精通并发与 netty 视频教程(2018)视频教程

    32_IO体系架构系统回顾与装饰模式的具体应用 33_Java NIO深入详解与体系分析 34_Buffer中各重要状态属性的含义与关系图解 35_Java NIO核心类源码解读与分析 36_文件通道用法详解 37_Buffer深入详解 38_NIO堆外内存与...

    精通并发与netty 无加密视频

    第32讲:IO体系架构系统回顾与装饰模式的具体应用 第33讲:Java NIO深入详解与体系分析 第34讲:Buffer中各重要状态属性的含义与关系图解 第35讲:Java NIO核心类源码解读与分析 第36讲:文件通道用法详解 第37...

    传智播客扫地僧视频讲义源码

    本教程共分为5个部分,第一部分是C语言提高部分,第二部分为C++基础部分,第三部分为C++进阶部分,第四部分为C、C++及数据结构基础部分,第五部分为C_C++与设计模式基础,内容非常详细. 第一部分 C语言提高部分目录...

    最新Python3.5零基础+高级+完整项目(28周全)培训视频学习资料

    积极思考正能量 Socket实现简单的ssh2 Socket粘包 Socket粘包深入编码 SocketServer SocketServer多并发 多用户在线Ftp程序 第9周 上节回顾 paramiko模块详解 ssh密钥讲解 进程与线程 多线程 多线程案例 主线程与...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    中文名: 经典Java EE企业应用实战--基于WebLogic/JBoss的JSF+EJB 3+JPA整合开发 原名: 经典Java EE企业应用实战--基于WebLogic/JBoss的JSF+EJB 3+JPA整合开发 作者: 李刚 资源格式: PDF 版本: 第一版 ...

    点线粒子机器人背景AI人工智能PPT模板

    总体来讲,对人工智能的定义大多可划分为四类,即机器“像人一样思考”、“像人一样行动”、“理性地思考”和" 理性地行动”。   这里“行动”应广义地理解为采取行动,或制定行动的决策,而不是肢体动作。 六、...

    JAVA程序设计教程

    思考与练习.....................................................................................................................12 上机实习题..............................................................

Global site tag (gtag.js) - Google Analytics