图解设计模式-笔记
Posted IBIT程序猿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图解设计模式-笔记相关的知识,希望对你有一定的参考价值。
这几天撸了一下杨文轩翻译的《图解设计模式》,然后按照他的思路,做了下面的笔记。本文仅记录我认为关键的笔记,想深入了解设计模式的童鞋们,请购买正版书。
引言
文章的组织结构没有按照书本的组织结构,而是按照 GoF 设计模式分类(创建型、结构型和行为型)。每个设计模式的组织方式大致按照(角色 -> 类图 -> 示例类图)的方式说明。
创建型模式
工厂模式(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(使用者):负责使用复制实例的方法生成新的实例
原型模式类图
原型模式示例类图
结构型模式
适配器模式(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 无法处理的工作
代理模式类图
代理模式示例类图
行为型模式
责任链模式(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 角色的集合
观察者模式类图
观察者模式示例类图
公众号
以上是关于图解设计模式-笔记的主要内容,如果未能解决你的问题,请参考以下文章