这几天撸了一下杨文轩翻译的《图解设计模式》,然后按照他的思路,做了下面的笔记。本文仅记录我认为关键的笔记,想深入了解设计模式的童鞋们,请购买正版书。
引言
文章的组织结构没有按照书本的组织结构,而是按照 GoF 设计模式分类(创建型、结构型和行为型)。每个设计模式的组织方式大致按照(角色 -> 类图 -> 示例类图)的方式说明。
创建型模式(5个)
- 工厂模式(Factory Method)
- 抽象工厂模式(Abstract Factory)
- 单例模式(Singleton)
- 建造者模式(Builder)
- 原型模式(Prototype)
工厂模式(Factory Method)
将实例的生成交给子类
工厂模式中的角色
- Product(产品):抽象类,定义生成的那些实例所持有的接口(API)
- Creator(创建者):负责生成 Product 角色的抽象类
- ConcreteProduct(具体产品):定义具体产品
- ConcreteCreator(具体创建者):负责生产具体产品
工厂模式类图
工厂模式示例类图
抽象工厂模式(Abstract Factory)
将关联零件组装成产品
抽象工厂模式中的角色
- AbstractProduct(抽象产品):负责定义 AbstractFactory 角色所生成的抽象零件和产品的接口(API)
- AbstractFactory(抽象工厂):负责定义用于生成抽象产品的接口(API)
- ConcreteProduct(具体产品):负责实现 AbstractProduct 角色的接口(API)
- ConcreteFactory(具体工厂):负责实现 AbstractFactory 角色的接口(API)
抽象工厂模式类图
抽象工厂模式示例类图
单例模式(Singleton)
只有一个实例
单例模式中的角色
- Singleton:唯一实例
单例模式类图
建造者模式(Builder)
组装复杂的实例
建造者模式中的角色
- Builder(建造者):负责定义用于生成实例的接口(API)
- ConcreteBuilder(具体的建造者):负责实现 Builder 角色的接口的类(API)
- Director(监工):负责使用Builder 角色的接口(API)来生成实例
建造者模式类图
建造者模式示例类图
原型模式(Prototype)
通过复制生成实例
原型模式中的角色
- Prototype(原型):负责定义用于复制现有实例来生成新实例的方法
- ConcretePrototype(具体的原型):负责实现复制现有的实例并生成新的实例的方法
- Client(使用者):负责使用复制实例的方法生成新的实例
原型模式类图
原型模式示例类图
结构型模式(7个)
- 适配器模式(Adapter)
- 桥接模式(Bridge)
- 组合模式(Composite)
- 装饰器模式(Decorator)
- 外观模式(Facade)
- 轻量级、享元模式(Flyweight)
- 代理模式(Proxy)
适配器模式(Adapter)
加个“适配器”以便于复用
适配器模式中的角色
- Target(对象):该角色负责定义所需的方法
- Client(请求者):该角色负责使用 Target 角色定义的方法进行具体处理
- Adaptee(被适配):持有特定方法的角色
- Adapter(适配):使用 Adaptee 角色的方法来满足 Target 角色的需求
适配器模式分类
- 类适配器模式:使用继承的适配器
- 对象适配器模式:使用委托的适配器
适配器模式类图
- 类适配器模式
- 对象适配器模式
适配器模式示例类图
- 类适配器模式
- 对象适配器模式
适配器模式拓展(版本升级与兼容性)
- 提高与旧版本软件的兼容性的 Adapter 模式
桥接模式(Bridge)
将类的功能层次结构与实现层次结构分离
结构的基础概念
- 类的功能层次结构
- 父类具有基本功能
- 在子类中增加新的功能
- 类的实现层次结构
- 父类通过声明抽象方法来定义接口(API)
- 子类通过实现具体方法来实现接口(API)
桥接模式中的角色
- Abstraction(抽象化):使用 Implementor 角色的方法定义了基本功能
- RefinedAbstraction(改善后的抽象化):在 Abstraction 的基础上增加新功能的角色
- Implementor(实现者):定义了用于实现 Abstraction 角色的接口(API)的方法
- ConcreteImplementor(具体实现者):负责实现在 Implementor 角色中定义的接口(API)
桥接模式类图
桥接模式示例类图
组合模式(Composite)
容器与内容的一致性
一致性基础概念
容器和内容当作是同一种对象。
组合模式中的角色
- Leaf(叶子):表示“内容”的角色,在该角色不能放入其他对象
- Composite(复合物):表示容器的角色,可以放入 Leaf 和 Composite 角色
- Component:使 Leaf 和 Composite 具有一致性的角色
- Client:使用 Composite 模式的角色
组合模式类图
组合模式示例类图
装饰器模式(Decorator)
装饰边框与被装饰物的一致性
装饰器模式中的角色
- Component:增加功能时的核心角色,定义基础的接口(API)
- ConcreteComponent:实现Component 角色所定义的接口(API)
- Decorator(装饰物):该角色具有与 Component角色相同的接口(API),在它内部保存了被装饰的对象(Component角色)
- ConcreteDecorator(具体的装饰物):具体的 Decorator 角色
装饰器模式类图
装饰器模式示例类图
外观(窗口)模式(Facade)
简单窗口
外观模式中的角色
- Facade(窗口):代表构成系统许多其他角色的“简单窗口”,向系统外部提供高层的接口(API)
- 构成系统的许多其他角色:各自完成自己的工作,被 Facade 角色调用进行工作,但是它们不会调用 Facade 角色的接口
外观模式类图
外观模式示例类图
享元(轻量级)模式(Flyweight)
共享对象,避免浪费
享元模式中的角色
- Flyweight(轻量级):表示那些实例会被共享的类
- FlyweightFactory(轻量级工厂):生成 Flyweight 角色的工厂,维护 Flyweight 池
- Client(请求者):使用 FlyweightFactory 角色生成 Flyweight 角色
享元模式类图
享元模式示例类图
代理模式(Proxy)
只在必要时生成实例
代理模式中的角色
- Subject(主体):定义了使 Proxy 角色和RealSubject 角色之间具有一致性的接口
- Proxy(代理人):代理人,自身无法处理的工作,交给 RealSubject 处理
- RealSubject(实际的主体):实际的主体,处理 Proxy 无法处理的工作
代理模式类图
代理模式示例类图
行为型模式(11个)
- 责任链模式(Chain of Responsibility)
- 命令模式(Command)
- 解析器模式(Interpreter)
- 迭代器模式(Iterator)
- 中介者(仲裁者)模式(Mediator)
- 备忘录(纪念品)模式(Memento)
- 观察者模式(Observer)
- 状态模式(State)
- 策略模式(Strategy)
- 模板模式(Template)
- 访问者模式(Visitor)
责任链模式(Chain of Responsibility)
推卸责任
责任链模式中的角色
- Handler(处理者):定义了处理请求的接口,当前 Handler 无法请求,则将请求转给下一个 Handler
- ConcreteHandler(具体处理者):处理请求的具体角色
- Client(请求者):向第一个 ConcreteHandler 发送请求的角色
责任链模式类图
责任链模式示例类图
命令模式(Command)
命令也是类
命令模式中的角色
- Command(命令):负责定义命令的接口(API)
- ConcreteCommand(具体的命令):负责实现 Command 角色定义的接口(API)
- Receiver(接收者):Command 角色执行命令时的对象,也称为命令的接收者
- Client(请求者):负责生成 ConcreteCommand 角色并分配 Receiver 角色
- Invoker(发动者):开始执行命令的角色,调用 Command 角色中定义的接口(API)
命令模式类图
命令模式时序图
命令模式示例类图
命令模式示例时序图
解析器模式(Interpreter)
语法规则也是类
修改程序思路转变
- 常用解决方案
- 引入 interpreter 模式
解析器模式中的角色
- AbstractExpression(抽象表达式):定义语法树节点的共同接口
- TerminalExpression(终结符表达式):对应 BNF 中终结符表达式
- NonterminalExpression(非终结符表达式):对应 BNF 中的非终结符表达式
- Context(文脉、上下文):为解析器进行语法解析提供必要的信息
- Client(请求者):调用 TerminalExpression 角色和 NonterminalExpression 角色
解析器模式类图
迭代器模式(Iterator)
一个一个遍历
迭代器模式中的角色
- Iterator(迭代器):该角色负责定义按顺序逐个遍历元素的接口(API)
- ConcreteIterator(具体的迭代器):该角色负责实现 Iterator 角色所定义的接口(API)
- Aggregate(集合):该角色负责定义创建 Iterator 角色的接口(API)
- ConcreteAggregate(具体集合):该角色负责实现 Aggregate 角色所定义的接口(API)
迭代器模式类图
迭代器模式示例类图
中介者(仲裁者)模式(Mediator)
只有一个仲裁者
中介者模式中的角色
- Mediator(仲裁者、中介者):负责定义与 Colleague 角色进行通信和做出决定的接口(API)
- ConcreteMediator(具体的仲裁者、中介者):负责实现 Mediator 角色的接口(API)
- Colleague(同事):负责定义与 Mediator 角色进行通信的接口(API)
- ConcreteColleague(具体的同事):负责实现 Colleague 角色的接口(API)
中介者模式类图
中介者模式示例类图
备忘录(纪念品)模式(Memento)
保存对象状态
备忘录模式中的角色
- Originator(生成者):负责生成或者恢复Memento
- Memento(纪念品、备忘录):Memento 角色会将 Originator 角色的内部信息整合在一起。通过宽、窄接口控制信息的访问。
- wide interface -- 宽接口:指所有用于获取恢复对象状态信息的方法的集合,供Originator 使用
- narrow interface -- 窄接口:有限的内部信息,防止信息泄露,供 Caretaker 使用
- Caretaker(负责人):通过 Originator 获取Memento,并保存
备忘录模式类图
备忘录模式示例类图
观察者模式(Observer)
发送状态变化通知
观察者模式中的角色
- Subject(被观察对象):定义了注册观察者和删除观察者的方法,还声明了“获取现在的状态”的方法
- ConcreteSubject(具体的观察对象):具体的被观察对象,当自身状态发生变化后,它会通知所有已经注册的 Observer 角色
- Observer(观察者):负责接收来自 Subject 角色的状态变化的通知,声明了 update 方法
- ConcreteObserver(具体的观察者):具体的观察者
观察者模式类图
观察者模式示例类图
状态模式(State)
用类表示状态
状态模式中的角色
- State(状态):定义不同状态进行不同的处理的接口(API),该接口(API)是那些处理内容依赖于状态的方法的集合
- ConcreteState(具体的状态):表示各个就具体的状态,实现了 State 接口
- Context(状况、前后关系、上下文):持有表示当前状态的 ConcreteState 角色,还定义供外部调用这使用 State 模式的接口
状态模式类图
状态模式示例类图
策略模式(Strategy)
整体地替换算法
策略模式中的角色
- Strategy(策略):负责决定实现策略所必须的接口(API)
- ConcreteStrategy(具体的策略):负责实现Strategy 角色的接口(API)
- Context(上下文):负责使用 Strategy 角色
策略模式类图
策略模式示例类图
模板模式(Template)
将具体处理交给子类
模板模式中的角色
- AbstractClass(抽象类):AbstractClass 角色不仅负责实现模板方法,还要负责声明在模板方法中所使用的抽象方法
- ConcreteClass(具体类):该角色负责具体实现 AbstractClass 角色中定义的抽象方法
模板模式类图
模板模式示例类图
访问者模式(Visitor)
访问数据结构并处理数据
访问者模式中的角色
- Visitor(访问者):负责对数据结构中的每个具体元素(ConcreteElement)声明一个用于访问的 visit 方法
- ConcreteVisitor(具体访问者):负责实现 Visitor 角色所定义的接口(API)
- Element(元素):表示 Visitor 角色的访问对象。它声明了接受访问者的 accept 方法
- ConcreteElement(具体元素):负责实现 Element 角色所定义的接口(API)
- ObjectStructure(对象结构):负责处理Element 角色的集合