`

思考装饰模式

阅读更多

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

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

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

 
相关模式

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

相关推荐

    “C#设计模式”是一本基础概述性及强的设计模式书籍,实例丰富还配有思考题

    第三部分会涵盖结构型模式,如适配器模式、装饰器模式、代理模式、桥接模式、组合模式、外观模式和享元模式。这些模式主要解决类与类之间的关系,通过结构上的调整优化代码结构,提高系统的灵活性和复用性。 第四...

    用设计模式思考 Thinking in Patterns

    《用设计模式思考 Thinking in Patterns》是一本深入探讨软件设计艺术的权威著作,它强调了在编程中应用设计模式的重要性。设计模式是软件开发中经过时间验证的最佳实践,它们是解决常见问题的有效模板,能够帮助...

    设计模式PPT

    3. **提升思维深度**:设计模式引导我们思考更高级别的设计问题。 4. **评估设计质量**:模式帮助判断设计是否优雅且实用,而不仅仅是能工作。 5. **提高代码质量**:设计模式的使用可以增强代码的可修改性和可维护...

    用Java模式思考Thinking in Patterns with Java

    - **装饰器模式**:允许向对象添加新的功能,同时又不改变其结构。 - **策略模式**:定义了一系列算法,并将每一个算法封装起来,使它们可以互相替换。 - **观察者模式**:定义了一种一对多的依赖关系,当一个对象的...

    《java设计模式》课后习题模拟试题解答——刘伟.zip

    3. **模式间的相互关系**:了解不同设计模式之间的关联和区别,比如装饰器和代理模式的区别,或者单例模式与静态内部类的实现差异。 4. **模式的优缺点**:评估每种模式的适用性和潜在问题,如过度设计或性能影响。 ...

    Head First设计模式(完整高清版).pdf

    - 装饰模式:动态地给一个对象添加一些额外的职责,装饰者和被装饰对象有相同的接口。 - 享元模式:运用共享技术有效地支持大量细粒度的对象。 4. **行为型设计模式** - 责任链模式:避免将处理逻辑硬编码在一个...

    深入浅出设计模式(中文版)

    结构型模式处理对象组合和继承关系,如适配器模式、装饰器模式和代理模式等,这些模式可以帮助我们构建更复杂、可扩展的系统。行为型模式关注对象之间的交互和责任分配,如策略模式、观察者模式和模板方法模式等,...

    设计模式汇总_圣思园Java版

    它可能会涵盖23种GOF(GoF, Gamma, Helm, Johnson, Vlissides)设计模式,包括结构型模式(如代理模式、装饰模式)、行为型模式(如策略模式、责任链模式)和创建型模式(如工厂模式、原型模式)。 学习这些设计...

    设计模式C#版

    装饰模式动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。装饰模式在.NET中常用于在不改变接口的前提下扩展对象的功能。 二十、代理模式 代理模式为其他对象提供一种代理以控制...

    Csharp设计模式电子版--一本很好C#设计模式

    2. 结构型模式:适配器模式(Adapter)、桥接模式(Bridge)、装饰模式(Decorator)、组合模式(Composite)、外观模式(Facade)、享元模式(Flyweight)和代理模式(Proxy)。这些模式关注于如何组合类和对象,...

    设计模式C++版

    3. Decorator模式,装饰模式,动态地给一个对象添加一些额外的职责。 ***posite模式,组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构。 5. Flyweight模式,享元模式,运用共享技术有效地支持大量细...

    java设计模式学习

    设计模式并不是银弹,但它们是经验的结晶,能够帮助开发者在面对复杂问题时有更清晰的思考路径。通过阅读“java设计模式学习”中的例子,你可以更好地理解这些模式的实际应用,并提升你的编程技能。

    新形势下装饰工程营销的思考.pdf

    疫情常态化对人们的生活方式、工作模式都产生了变化,装饰工程营销需要针对“宅经济”、“远程办公”等新的市场需求进行策略调整。 上述内容是对“新形势下装饰工程营销的思考”的一些核心知识点的详细说明,包括了...

    漫谈设计模式-从面向对象开始

    2. 结构型模式:描述如何组合类和对象以获得更大的结构,常见的有适配器模式、桥接模式、组合模式、装饰者模式、外观模式、享元模式和代理模式。 3. 行为型模式:涉及对象之间的职责分配,包括命令模式、解释器模式...

    设计模式视频课程PPT

    包括适配器模式(Adapter)、桥接模式(Bridge)、装饰模式(Decorator)、外观模式(Facade)、享元模式(Flyweight)、组合模式(Composite)和代理模式(Proxy)。这些模式可以帮助我们处理类与类之间的关系,...

    Java与模式pdf

    3. **结构型模式**:如适配器模式、装饰器模式、代理模式、桥接模式、组合模式、外观模式和享元模式,这些模式关注于如何组合类和对象,以构建更复杂的软件结构。 4. **行为型模式**:包括策略模式、模板方法模式、...

    模式设计(中文版)学习模式设计必备书籍。经典著作

    2. 结构型模式:这类模式关注如何将类和对象组合成更大的结构,例如适配器模式、装饰器模式、代理模式、桥接模式、组合模式、外观模式和享元模式。这些模式帮助我们更好地管理类与类之间的关系,提高代码的可维护性...

    设计模式沉思pdf

    结构型模式则关注如何将不同的类或对象组合在一起,例如适配器模式、桥接模式、装饰器模式、外观模式、组合模式和代理模式,这些模式有助于构建复杂系统,保持代码的整洁和模块化。行为型模式主要关注对象之间的交互...

    Head.First设计模式_PDF

    2. 结构型模式:这类模式主要关注如何组合类和对象以创建更复杂的结构,包括适配器模式(Adapter)、装饰器模式(Decorator)、外观模式(Facade)、桥接模式(Bridge)、组合模式(Composite)、享元模式...

    HeadFirst设计模式英文版

    这些模式包括但不限于单例模式(Singleton)、工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory)、建造者模式(Builder)、原型模式(Prototype)、适配器模式(Adapter)、装饰器模式(Decorator...

Global site tag (gtag.js) - Google Analytics