设计模式

设计原则

  1. 封装变化:找出应用之中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起
  2. 多用组合,少用继承
  3. 针对接口编程,不针对实现编程
  4. 为交互对象之间的松耦合设计而努力
  5. 类应该对扩展开放,对修改关闭
  6. 依赖抽象,不要依赖具体类
  7. 只和朋友交谈
  8. 别找我,我会找你
  9. 类应该只有一个改变的理由

能用设计原则解决的问题就不要用设计模式,设计原则实现起来更加灵活,更加轻巧

1. 策略模式

设计原则:

  • 封装变化
  • 多用组合,少用继承
  • 针对接口编程,而不是针对实现编程

定义:定义了算法族,分别封装起来,让他们之间可以互相替换, 此模式让算法的变化独立于使用算法的客户

eg:

设计模式 - 图1

2. 观察者模式

设计原则:

  • 为了交互对象之间松耦合设计而努力

定义:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会受到通知并自动更新

eg:

设计模式 - 图2

3. 装饰者模式

设计原则:

  • 类应该对扩展开放,对修改关闭(开放-关闭原则)

定义:动态地将责任附加到对象上

eg:

设计模式 - 图3

4. 工厂模式

设计原则:

  • 要依赖抽象,不要依赖具体类(依赖倒置原则)

定义:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类

eg:

设计模式 - 图4

5. 单例模式

定义:确保一个类只有一个实例,并提供一个全局访问点

eg:

设计模式 - 图5

6. 命令模式

定义:将请求封装成对象,一边使用不同的请求、队列或者日志来来参数化其他对象。命令模式也支持可撤销的操作。

eg:

设计模式 - 图6

7. 适配器模式和外观模式

设计原则:

  • 只和你的密友谈话(最少知识原则)

定义:将一个类的接口,转换成客户期望的另一个接口,适配器让原本接口不兼容的类可以合作无间。
外观模式提供了一个统一的接口,用来访问自系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用

eg:

设计模式 - 图7

8. 模板方法模式

设计原则:

  • 别调用我们,我们会调用你(好莱坞原则)

定义:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

eg:

设计模式 - 图8

9. 迭代器与组合模式

设计原则:

  • 一个类只有一个引起变化的原因(单一责任原则)

定义:

  • 迭代器模式:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
  • 组合模式:允许你将对象组合成树形节后来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。

eg:

迭代器模式:

设计模式 - 图9

组合模式:

设计模式 - 图10

10. 状态模式

定义:把所有动作都封装在状态对象中,状态持有者将行为委托给当前状态对象。

eg:

设计模式 - 图11

11. 代理模式

定义:通过插入第三方(代理对象)来分离调用者和被调用者(不同于执行者)

eg:
设计模式 - 图12

12. 复合模式

定义:将多个模式组合结合起来形成一个“框架”,以解决一般性问题

eg:
设计模式 - 图13
设计模式 - 图14

13. 桥接模式

定义:将抽象的控制类与具体实现类通过组合解耦,使得抽象层类与实现层类可以对立与对方而变化

eg:
设计模式 - 图15

14. 生成器模式

定义:用来封装组合结构(树形结构)的构造过程,与迭代器模式类似,都隐藏了组合结构的内部实现,只提供一组用于创建组合结构的接口

eg:
设计模式 - 图16

15. 责任链模式

定义:让一个请求可以被一组接收者顺序处理,类似于Android处理请求的方式:一个接收者捕获请求后可以return true消费掉请求,也可以return false传递给接收者队列中的下一个接收者(观察者)

eg:
设计模式 - 图17

16. 蝇量模式

定义:抽象出对象管理层来统一管理大量的同类型对象,以减少运行时对象实例的个数,减少内存消耗

eg:
设计模式 - 图18

17. 解释器模式

定义:用来为简单语言创建解释器,将语法规则直接映射为各个类,结构简单,但效率较低

eg:
设计模式 - 图19

18. 中介者模式

定义:引入中介者来封装多个对象间的复杂交互,以降低同级(在类结构统一层次上的)对象间的依赖

eg:
bad:

设计模式 - 图20
good:
设计模式 - 图21

19. 备忘录模式

定义:支持对象状态的保存与恢复,并将对象状态数据封装起来,独立于客户代码以提供保护(Java中可以结合序列化反序列化技术来实现该模式)

eg:
设计模式 - 图22

20. 原型模式

定义:以现有的对象为原型,通过clone得到新的对象(以简化新对象的创建过程)

eg:
设计模式 - 图23

21. 访问者模式

定义:为组合结构添加新的操作,而不需要频繁的改变组合结构

eg:

设计模式 - 图24