上午题 #9 设计模式

总览

  • 工厂单例建原型: 创建型模式
  • 世代外接享组合: 结构性模式
  • 剩下的(其他的)都是行为型模式共11个

创建型模式(5个):

  1. 工厂方法 (创建型类)
  2. 抽象工厂方法 (创建型对象)
  3. 单例模式 (创建型对象)
  4. 建造者模式 (创建型对象)
  5. 原型模式 (创建型对象)

结构性模式(7种):

  1. 装饰器模式 (结构型对象)
  2. 适配器模式 特殊: 既是结构型对象模式 ,也是结构型类模式
  3. 代理模式 (结构型对象)
  4. 外观者模式 (结构型对象)
  5. 桥接模式 (结构型对象)
  6. 享元模式 (结构型对象)
  7. 组合模式 (结构型对象)

行为型模式(11种)

  1. 策略模式 (行为型对象)
  2. 模板方法模式 (行为型类模式)
  3. 观察者模式 (行为型对象)
  4. 迭代子模式 (行为型对象)
  5. 责任链模式 (行为型对象)
  6. 命令模式 (行为型对象)
  7. 备忘录模式 (行为型对象)
  8. 状态模式 (行为型对象)
  9. 访问者模式 (行为型对象)
  10. 中介者模式 (行为型对象)
  11. 解释器模式 (行为型类模式)

单例模式 Singleton

意图

保证一个类仅有一个实例,并提供一个访问它的全局访问点

用途

image-20250330144433264


image-20250330164807286



工厂方法模式 Factory

image-20250522064733550

image-20250522064808280

image-20250522064843520

抽象工厂模式 Abstract Factory

特点

  1. 创建多个产品族
  2. 多个抽象产品接口
  3. 1个工厂级产生多个产品

意图:

提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类

image-20250522065121304


image-20250522065258874


image-20250330151536190


image-20250330161028516


生成器模式(Builder)/建造者模式

image-20250522065356078

image-20250522065444211


特点

Builder模式适用于:

  1. 创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式
  2. 构造过程必须允许被构造的对象有不同的表示时

image-20250330162023336


image-20250330162218535


image-20250330162350310


原型模式

image-20250522065634227

image-20250522065744392


单例模式

image-20250522065845574


适配器模式 Adapter

image-20250522065952703

image-20250522070238668

转换原接口 得到 兼容的接口

image-20250330165155110


桥接模式 Bridge

意图:

抽象部分实现部分分离, 使他们可以独立变化

英文单词关键词:OperationImp

Bridge模式适用于:

  1. 不希望抽象和它的实现部分之间一个固定绑定关系
  2. 类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充
  3. 对一个抽象的实现部分的修改应对客户不产生影响,即客户代码不必重新编译
  4. 有许多类要生成的类层次结构
  5. 想在多个对象间共享实现(可能使用引用计数),但同时要求客户并不知道这一点。

image-20250330165544631


image-20250330165832192


image-20250330171618531


组合模式 Composite

意图

将对象组合成树型结构以表示“部分-整体”的的层次结构。Composite使 得用户对单个对象 和组合对象的使用具有一致性。

适用性

  1. 想表示对象的部分-整体层次结构
  2. 希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

image-20250330190741968


image-20250330193000426

分析:

  • Component:作为抽象基类,定义了所有部件(包括叶子Leaf和组合Composite)的通用接口(如add()remove())。
  • CompositeComponent的子类,实现有子部件的具体行为。
  • Leaf是叶子节点,不包含子部件(可能抛出“不支持操作”异常)

image-20250330193646453


image-20250330194825110


装配器模式 Decorator

意图

动态地给对象添加一些职责, 比生成子类更加灵活

image-20250330195151765


其中: Component定义一个对象接口,可以给这些对象动态地添加职责。 ConcreteComponent定义一个对象,可以给这个对象添加一些职责。 Decorator 维持一个指向Component 对象的指针,并定义一个与 Component 接口一致 的接口。 ConcreteDecorator向组件添加职责。

适用性

  1. 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责
  2. 处理那些可以撤销的职责。
  3. 当不能采用生成子类的方式进行扩充时。一种情况是,可能有大量独立的扩展,为支 持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是,
  4. 由于类定义被隐藏,或类定义不能用于生成子类。

外观模式 Facade

意图

定义一个高层接口,为子系统中的一组接口提供一个一致的外观,从而简化了该子系统的使用

将一系列对象加以包装简化接口

结构

image-20250330202116848

  • Facade知道哪些子系统类负责处理请求;将客户的请求代理给适当的子系统对象。不要混淆认为代理模式
  • Subsystem classes实现子系统的功能;处理有Facade对象指派的任务;没有Facade的 任何相关信息,即没有指向Facade的指针。

image-20250330202919930


image-20250330230701571


享元模式 Flyweight

意图

运用共享技术有效地支持大量细粒度的对象

结构

image-20250330230844828


image-20250330231101882


代理模式 Proxy

意图

通过提供相同的接口,为其他对象提供代理以控制这个对象访问

结构

image-20250330231309902


image-20250330231528381


责任链模式 Chain Of Reponsibility

意图

使多个对象都有机会处理请求,从而避免发送者和请求者之间的耦合关系.将这些对象连接成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止

结构

image-20250330232201518

  1. Handler定义一个处理请求的接口;(可选)实现后继链。
  2. ConcreteHandler处理它所负责的请求;可访问它的后继者;如果可处理该请求,就处 理它,否则将该请求转发给后继者。
  3. Client向链上的具体处理者(ConcreteHandler)对象提交请求。

image-20250501164728644


命令模式 Command

意图

将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化,将请求排队记录请求日志支持可撤销的操作

类图关键英文单词 CommandExecute

适用于:

(1)抽象出待执行的动作以参数化某对象。

(2)在不同的时刻指定、排列和执行请求。

(3)支持取消操作。

(4)支持修改日志。

(5)用构建在原语操作上的高层操作构造一个系统。

结构

image-20250330232751073

  1. Command 声明执行操作的接口。
  2. ConcreteCommand 将一个接收者对象绑定于一个动作;调用接收者相应的操作,以实 现Execute。
  3. Client 创建一个具体命令对象并设定它的接收者。
  4. Invoker 要求该命令执行这个请求。
  5. Receiver 知道如何实施与执行一个请求相关的操作。任何类都可能作为一个接收者。

image-20250330233006627


image-20250330233931024


解释器模式 Expression

意图

给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来 解释语言中的句子。

结构

image-20250330234228669


迭代器模式 Iterator

意图

提供一种方法顺序访问一个聚合对象中的各个元素,且不能暴漏该对象的内部表示.

结构

image-20250330234508716


  1. Iterator(迭代器)定义访问和遍历元素的接口。
  2. ConcreteIterator(具体迭代器)实现迭代器接口;对该聚合遍历时跟踪当前位置。
  3. Aggregate(聚合)定义创建相应迭代器对象的接口。
  4. ConcreteAggregate(具体聚合)实现创建相应选代器的接口,该操作返回ConcreteIterator 的一个适当的实例。

中介者模式 Meditor

意图

用一个对象封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而 使其耦合松散,而且可以独立地改变它们之间的交互

结构

image-20250330234754741


适用于

备忘录模式 Memento

意图

不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,从而可以在以后将该对象恢复原先保存的状态

结构

image-20250331223328573


观察者模式 Observer

意图

定义对象间一对多的关系,当一个对象的状态发生变化时,所有依赖它的对象都能得到通知并自动更新

结构

image-20250331230103546


image-20250331230325057


image-20250331225548646


状态模式 state

意图

允许一个对象在其内部状态改变时改变它的行为.对象看起来修改了他的类

结构

image-20250331230629070


适用性

一个对象的行为决定于它的状态,并且时刻根据它的状态改变它的行为

image-20250331231242521


image-20250331231508207


策略模式

意图

定义一系列的算法,并把他们封装起来,使他们可以相互替换.

结构

image-20250331231654157

适用性

image-20250331231837535


image-20250331231913915


模板方法模式 Template Method

意图

定义1个算法中的算法骨架,而将一些步骤延迟到子类.使得子类可以不修改1个算法的结构即可重新定义该算法的某些特定步骤

结构

image-20250331232214542


适用性

访问者模式 Visitor

意图

表示1个作用于某个对象中的各元素操作.它允许在不改变各元素的类的前提下定义作用于这些元素的新操作

结构

image-20250331232539160

适用性

需要对一个对象结构中的对象进行很多不同的并且不相关的操作


image-20250331232831742


image-20250331234712294


image-20250331234853404


image-20250331235052900


image-20250331235217156


image-20250331235650871


image-20250331235904114


image-20250401000121552


image-20250401000310359


image-20250401000426721