ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

设计模式【六】—— 装饰者模式/组合模式/外观模式

2020-06-08 18:51:57  阅读:349  来源: 互联网

标签:外观 组合 对象 接口 模式 设计模式 子系统


第八章 装饰者模式

8.1 定义

装饰者模式是指:动态的将新功能附加到对象上。在对象功能扩展方面,它比继承更有弹性,装饰者模式也体现了开闭原则(ocp)

8.2 角色及职责

  • Component 主体:比如 Drink
  • ConcreteComponent:具体的主体, 比如各个单品咖啡 DeCaf, LongBlack 等
  • Decorator: 装饰者,比如各种调料 Milk, Soy 等
    在 Component 与 ConcreteComponent 之间,如果 ConcreteComponent 类很多,还可以设计一个缓冲层,将共有的部分提取出来,抽象层一个类。

举例:

装饰者模式就像打包一个快递

  • 主体:如:陶瓷、衣服(Component)—— 被装饰者
  • 包装:如:报纸填充、塑料泡沫、纸板、木板(Decorator)—— 装饰者

8.3 在 JDK 中的应用

jdk 的 io 体系中,使用了装饰者模式,FilterInputStream 就是一个装饰者。

  • InputStream 是抽象类, 类似前面的 Drink
  • FileInputStream 是 InputStream 子类,类似前面的 DeCaf, LongBlack
  • FilterInputStream 是 InputStream 子类,类似前面 的 Decorator 修饰者
  • DataInputStream 是 FilterInputStream 子类,具体的修饰者,类似前面的 Milk, Soy 等
  • FilterInputStream 类 有 protected volatile InputStream in; 即含被装饰者

——————————————————————————————————————

第九章 组合模式

9.1 基本介绍

  1. 组合模式(Composite Pattern)又叫部分整体模式,它创建了对象组的树形结构,将对象组合成树状结构以表示“整体-部分”的层次关系。
  2. 属于结构型模式
  3. 组合模式使得用户对单个对象和组合对象的访问具有一致性,即:组合能让客户以一致的方式处理个别对象以及组合对象。

9.2 角色及职责

  1. Component:这是组合中对象声明接口,在适当情况下,实现所有类共有的接口默认行为,用于访问和管理 Component 子部件,Component 可以是抽象类或者接口。其中那些叶子节点不用实现的方法使用默认实现。
  2. Leaf : 在组合中表示叶子节点,叶子节点没有子节点。
  3. Composite:非叶子节点, 用于存储子部件, 在 Component 接口中实现子部件的相关操作,比如增加(add),删除等。

9.3 注意事项和细节

  1. 简化客户端操作。客户端只需要面对一致的对象而不用考虑整体部分或者节点叶子的问题。
  2. 具有较强的扩展性。当我们要更改组合对象时,我们只需要调整内部的层次关系,客户端不用做出任何改动。
  3. 方便创建出复杂的层次结构。客户端不用理会组合里面的组成细节,容易添加节点或者叶子从而创建出复杂的树形结构。
  4. 需要遍历组织机构,或者处理的对象具有树形结构时,非常适合使用组合模式。
  5. 要求较高的抽象性,如果节点和叶子有很多差异性的话,比如很多方法和属性都不一样,不适合使用组合模式。

9.4 在 JDK 集合中的使用

Java 的集合类 HashMap 就使用了组合模式。


第十章 外观模式

10.1 基本介绍

  1. 外观模式(Facade),也叫过程模式,为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
  2. 这个一致的接口,用以屏蔽内部子系统的细节,使得调用端只需跟这个接口发生调用,而无需关心这个子系统的内部细节。
  3. 外观模式可以理解为转换一群接口,客户只要调用一个接口,而不用调用多个接口才能达到目的,解决多个复杂接口带来的使用困难,起到简化用户操作的作用。

10.2 角色与职责

  • 外观类(Facade):为调用端提供统一的调用接口,外观类知道哪些子系统负责处理请求,从而将调用端的请求代理给适当子系统对象。
  • 调用者(Client):外观接口的调用者。
  • 子系统的集合:指模块或者子系统,处理 Facade 对象指派的任务,他是功能的实际提供者。

10.3 注意事项和细节

  1. 外观模式对外屏蔽了子系统的细节,因此外观模式降低了客户端对子系统使用的复杂性。
  2. 外观模式对客户端与子系统的耦合关系 - 解耦,让子系统内部的模块更易维护和扩展。
  3. 通过合理的使用外观模式,可以帮我们更好的划分访问的层次。
  4. 当系统需要进行分层设计时,可以考虑使用 Facade 模式。
  5. 在维护一个遗留的大型系统时,可能这个系统已经变得非常难以维护和扩展,此时可以考虑为新系统开发一个Facade 类,来提供遗留系统的比较清晰简单的接口,让新系统与 Facade 类交互,提高复用性。
  6. 不能过多的或者不合理的使用外观模式,使用外观模式好,还是直接调用模块好,要以让系统有层次,利于维护为目的。

10.4 在 MyBatis 框架中的应用

MyBatis 中的 Configuration 去创建 MetaObject 对象使用到外观模式。

标签:外观,组合,对象,接口,模式,设计模式,子系统
来源: https://www.cnblogs.com/Songzw/p/13067636.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有