图解设计模式-笔记

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 角色的集合

观察者模式类图

图解设计模式-笔记

观察者模式示例类图

公众号



以上是关于图解设计模式-笔记的主要内容,如果未能解决你的问题,请参考以下文章

图解设计模式 读书笔记

联想IdeaPad U150 拆机图解

图解算法读书笔记

JAVA设计模式大总结(二十三)--- b站尚硅谷设计模式之 职责链模式 图解 + 代码 整理(超详)

《Head First设计模式》中文版 读书笔记

《Head First设计模式》中文版 读书笔记