设计原则
- 封装变化:找出应用之中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起
- 多用组合,少用继承
- 针对接口编程,不针对实现编程
- 为交互对象之间的松耦合设计而努力
- 类应该对扩展开放,对修改关闭
- 依赖抽象,不要依赖具体类
- 只和朋友交谈
- 别找我,我会找你
- 类应该只有一个改变的理由
能用设计原则解决的问题就不要用设计模式,设计原则实现起来更加灵活,更加轻巧
1. 策略模式
设计原则:
- 封装变化
- 多用组合,少用继承
- 针对接口编程,而不是针对实现编程
定义:定义了算法族,分别封装起来,让他们之间可以互相替换, 此模式让算法的变化独立于使用算法的客户
eg:
2. 观察者模式
设计原则:
- 为了交互对象之间松耦合设计而努力
定义:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会受到通知并自动更新
eg:
3. 装饰者模式
设计原则:
- 类应该对扩展开放,对修改关闭(开放-关闭原则)
定义:动态地将责任附加到对象上
eg:
4. 工厂模式
设计原则:
- 要依赖抽象,不要依赖具体类(依赖倒置原则)
定义:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类
eg:
5. 单例模式
定义:确保一个类只有一个实例,并提供一个全局访问点
eg:
6. 命令模式
定义:将请求封装成对象,一边使用不同的请求、队列或者日志来来参数化其他对象。命令模式也支持可撤销的操作。
eg:
7. 适配器模式和外观模式
设计原则:
- 只和你的密友谈话(最少知识原则)
定义:将一个类的接口,转换成客户期望的另一个接口,适配器让原本接口不兼容的类可以合作无间。
外观模式提供了一个统一的接口,用来访问自系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用
eg:
8. 模板方法模式
设计原则:
- 别调用我们,我们会调用你(好莱坞原则)
定义:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
eg:
9. 迭代器与组合模式
设计原则:
- 一个类只有一个引起变化的原因(单一责任原则)
定义:
- 迭代器模式:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
- 组合模式:允许你将对象组合成树形节后来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。
eg:
迭代器模式:
组合模式:
10. 状态模式
定义:把所有动作都封装在状态对象中,状态持有者将行为委托给当前状态对象。
eg:
11. 代理模式
定义:通过插入第三方(代理对象)来分离调用者和被调用者(不同于执行者)
eg:
12. 复合模式
定义:将多个模式组合结合起来形成一个“框架”,以解决一般性问题
eg:
13. 桥接模式
定义:将抽象的控制类与具体实现类通过组合解耦,使得抽象层类与实现层类可以对立与对方而变化
eg:
14. 生成器模式
定义:用来封装组合结构(树形结构)的构造过程,与迭代器模式类似,都隐藏了组合结构的内部实现,只提供一组用于创建组合结构的接口
eg:
15. 责任链模式
定义:让一个请求可以被一组接收者顺序处理,类似于Android处理请求的方式:一个接收者捕获请求后可以return true消费掉请求,也可以return false传递给接收者队列中的下一个接收者(观察者)
eg:
16. 蝇量模式
定义:抽象出对象管理层来统一管理大量的同类型对象,以减少运行时对象实例的个数,减少内存消耗
eg:
17. 解释器模式
定义:用来为简单语言创建解释器,将语法规则直接映射为各个类,结构简单,但效率较低
eg:
18. 中介者模式
定义:引入中介者来封装多个对象间的复杂交互,以降低同级(在类结构统一层次上的)对象间的依赖
eg:
bad:
good:
19. 备忘录模式
定义:支持对象状态的保存与恢复,并将对象状态数据封装起来,独立于客户代码以提供保护(Java中可以结合序列化反序列化技术来实现该模式)
eg:
20. 原型模式
定义:以现有的对象为原型,通过clone得到新的对象(以简化新对象的创建过程)
eg:
21. 访问者模式
定义:为组合结构添加新的操作,而不需要频繁的改变组合结构
eg: