策略模式
定义了算法族,分别封装起来,让它们之间可以互相替换。
此模式让算法的变化,独立于使用算法的客户。
观察者模式
定义了对象间的一对多依赖,当一个对象(Subject)改变状态时,它的所有依赖者(Observer)都会收到通知并自动更新。
- 观察者是对象间的关系
- 观察者需要依赖主题对象,而非一个简单的事件!!
- 有多个观察者时,不能依赖特定的通知顺序
- 数据更新,有推(Push)、拉(Pull)两种方式(推被认为更合理)
装饰者模式
动态地将责任附加到对象上。
拓展功能,装饰者提供了比继承更有弹性的替代方案。
- 装饰者会导致设计中出现很多小对象,若使用过度会让程序变得复杂
- 装饰者(Decorator)继承自组件(Component),其目的是“类型匹配”,而不是继承“行为”
- 每个装饰者应该是独立的,不应该去感知是否有其他的装饰者存在
- 意图:追加责任(不改变接口)
单例模式 (Singleton Pattern)
确保一个类只有一个实例,并提供一个全局访问点。
命令模式(Command)
将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。
命令模式也支持可撤销的操作。
- 命令模式将调用者和执行者解耦
- 命令可用来实现日志和事务系统
- 通常命令只是简单的调用执行者的接口,但“聪明”但命令对象,可以直接实现请求,而不是将工作委托给执行者
- Command是回调机制的一个面向对象的替代品
适配器模式
将一个类的接口,转换成客户期望的另一个接口。
适配器让原本接口不兼容的类,可以合作无间。
- 适配器就是组合(composition)原对象,然后实现(implement)目标接口
- 适配器模式分为类适配器与对象适配器,其中类适配器采用多继承机制实现,故常用的是对象适配器
- 意图:转换接口
外观模式 (Facade Pattern)
提供了一个统一的接口,用来访问子系统中的一群接口。
外观定义了一个高层接口,让子系统更容易使用
- 外观通过增加类,来减少依赖(将客户从组件的子系统中解耦)
- 意图:简化接口
- 外观并不定义新功能
- 外观是单向的,子系统内部并不知道Facade的存在
模版方法模式
在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。
模版方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
- 工厂方法是模版方法的一种特殊版本
- 策略与模版方法都封装算法,前者用组合,后者用继承
迭代器模式
提供一种方法,顺序访问聚合对象(集合)中的各个元素,而又不暴露其内部的实现
- 迭代器的“顺序访问”并不意味着“有序访问”
组合模式 (Composite Pattern)
允许你将对象组合成树形结构来表现“整体/部分”的层次结构。
组合能让客户以一致的方式处理个别对象以及对象组合。
- 组合模式违背了“单一责任”原则,要管理层次结构,还要处理对象原本的责任
- 组合模式更注重对客户的“透明”
状态模式
允许对象在内部状态改变时,改变它的行为,对象看起来好像修改了它的类。
- 将状态封装成独立的类,并将动作委托给当前状态的对象
- 新增状态,会影响上游状态的实现(上游状态要转换到新增的状态)
- 状态的转换在内部完成,客户感知不到转换过程(客户仅和Context交互)
- 状态转换可以由State类或Context类控制:一般,当状态转换是固定的时候,适合用Context控制;当转换更动态时,放在State中。
决策考量:当系统进化时,应该对谁修改封闭(Context还是State) - 状态对象可以被多个Context实例共享(State不保存自己的数据)
代理模式
为另一个对象提供一个替身或占位符,以控制对这个对象的访问
使用Proxy模式常见情况:
- 远程代理(Remote Proxy):控制访问远程对象
- 虚代理(Virtual Proxy):控制访问“创建开销大”的对象
- 保护代理(Protection Proxy):基于权限,控制对资源的访问
- 智能引用代理(Smart Reference Proxy):当主题被引用时,进行额外的动作。如:引用计数、首次加载
用模式思考
- 保持简单(Keep It Simple/KISS)
设计目标是用最简单的方式解决问题,而不是如何使用模式 - 设计模式非万灵丹;事实上,连什么丹都算不上!
模式是解决一再发生的问题的通用方案
每个模式有其适用范围,不是所有问题都能用模式解决 - 知道何时需要模式
设计时,如果确定在设计中可以用某个模式解决某个问题,那么就用它; - 重构的时间就是模式的时间!
重构的目标是改善其结构,而不是行为。这个过程正适合引入模式。 - 拿掉你所不需要的,不要害怕将一个设计模式从设计中删除
当系统变的非常复杂,并且并不需要预留弹性的时候,就不需要使用模式 - 如果你现在不需要,就别做!!
避免过度设计
网友评论