设计模式讨论的是可复用的对象协作方式;理解它们之前,最好先熟悉下面这些面向对象设计原则。模式文档里提到的「违反某某原则」,通常指的就是这些。

设计原则

SOLID

原则英文要点
单一职责Single Responsibility (SRP)一个类只应有一个引起它变化的原因;职责过多时拆分。
开闭Open/Closed (OCP)对扩展开放、对修改关闭;加新行为时尽量新增代码,而不是改旧代码。
里氏替换Liskov Substitution (LSP)子类对象应能替换父类对象使用,且不破坏程序正确性。
接口隔离Interface Segregation (ISP)客户端不应被迫依赖它用不到的接口;大接口拆成小接口。
依赖倒置Dependency Inversion (DIP)高层模块不依赖低层模块的具体实现,二者都依赖抽象(接口/抽象类)。

其他常见原则

原则要点
合成复用优先用组合(has-a)扩展行为,而不是靠继承(is-a)堆叠子类。
迪米特法则又称最少知识原则:对象只与直接朋友通信,少跨层调用,降低耦合。
针对接口编程声明类型、传参、返回值尽量用抽象类型,运行时再绑定具体实现。

更详细的 SOLID 学习资源见 选修扩展 · SOLID

设计模式

创建型模式

模式别名描述
工厂方法模式(Factory Method)虚拟构造器提供一种创建对象的方式,使创建过程与使用过程分离。
抽象工厂模式(Abstract Factory)提供创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
生成器模式(Builder)建造者模式分步骤构建复杂对象,将构建过程与最终表示分离。
原型模式(Prototype)克隆通过复制已有实例创建新对象,将克隆过程与使用过程分离。
单例模式(Singleton)单件模式保证一个类仅有一个实例,并提供一个访问它的全局访问点。

结构型模式

模式别名描述
适配器模式(Adapter)封装器模式将一个类的接口转换成客户期望的另一个接口,使原本因接口不兼容而不能一起工作的类可以一起工作。
桥接模式(Bridge)将抽象部分与实现部分分离,使它们都可以独立地变化。
组合模式(Composite)对象树将对象组合成树形结构以表示部分-整体层次,使客户端对单个对象和组合对象的使用具有一致性。
装饰器模式(Decorator)装饰模式、装饰者模式动态地给对象添加额外的职责,比生成子类更灵活地扩展功能。
外观模式(Facade)门面模式为复杂子系统提供统一的高层接口,使客户端更容易使用整组能力。
享元模式(Flyweight)缓存运用共享技术支持大量细粒度对象,将内部状态与外部状态分离并按键复用。
代理模式(Proxy)为其他对象提供替身以控制对其的访问,在委托真实主题前后插入懒加载、鉴权、远程或缓存等逻辑。

行为型模式

模式别名描述
责任链模式(Chain of Responsibility)职责链模式、命令链使多个对象都有机会处理请求,将处理者连成链并沿链传递,直到有对象处理或全会签通过。
命令模式(Command)动作、事务将请求封装为对象,从而支持参数化、排队、日志记录以及撤销与重做。
迭代器模式(Iterator)提供顺序访问聚合元素的方法而不暴露内部表示,支持多种遍历策略与分页流式访问。
中介者模式(Mediator)调解人、控制器用中介对象封装一组对象之间的交互,使同事不必相互引用,降低网状耦合并集中联动规则。
备忘录模式(Memento)快照在不破坏封装的前提下捕获并外部保存对象状态,以便之后由发起人将其恢复到先前状态。
观察者模式(Observer)事件订阅者、监听者定义一对多依赖,主题状态变更时自动通知所有观察者,使写状态与扇出副作用解耦。
状态模式(State)允许对象在内部状态改变时改变行为,将各态允许的操作与状态迁移封装在独立 State 中。
策略模式(Strategy)封装一族可互换算法,使它们可独立于客户端替换,消除 Context 内的条件分支。
模板方法模式(Template Method)在模板方法中定义算法骨架,将可变步骤延迟到子类或钩子,复用流程并固定顺序与补偿。
访问者模式(Visitor)在不改变元素类的前提下,将作用于结构上各元素的操作封装为访问者,通过 Accept/Visit 双重分派。

其他资源