图解设计模式-笔记

iBit程序猿 2020年09月09日 1,247次浏览

    这几天撸了一下杨文轩翻译的《图解设计模式》,然后按照他的思路,做了下面的笔记。本文仅记录我认为关键的笔记,想深入了解设计模式的童鞋们,请购买正版书。

引言

文章的组织结构没有按照书本的组织结构,而是按照 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 角色的集合

访问者模式类图

访问者模式示例类图