博客
关于我
23种设计模式(超级简洁)
阅读量:797 次
发布时间:2023-04-04

本文共 2254 字,大约阅读时间需要 7 分钟。

关于设计模式

这篇文章参考了《设计模式-可复用面向对象基础》一书中提供的四人帮23种模式的快速参考,每个模式都包括类图、解释、使用说明和实际例子。


Chain of Responsibility 责任链

目的

通过将多个接受请求的对象链接起来,使多个对象都能执行请求。

使用

  • 允许多个对象处理一个请求,处理者不必是特定的对象。
  • 动态决定请求的处理者。
  • 请求可能最终没有被任何对象处理。

例子

在异常处理中,当一个异常被抛出时,系统会沿调用堆栈向上传递,直到找到可以处理该异常的对象。


Command 命令

目的

封装一个请求,使其可以作为对象处理,适用于回调和异步操作。

使用

  • 需要实现回调功能。
  • 需要在不同时间或顺序处理多个请求。
  • 需要记录请求日志。
  • 请求和处理对象解耦。

例子

工作队列广泛应用于异步处理算法,通过命令模式,发起的请求可以被排队处理,系统无需关心具体实现。


Interpreter 解释器

目的

定义语法表示和解释机制。

使用

  • 语法可以表示为一棵语法树。
  • 语法简单,效率不重要。
  • 语法与底层解耦。

例子

冒险游戏中的命令系统,通过解释器模式实现命令的嵌套和修改。


Mediator 调停者

目的

通过封装对象集之间的交互,实现松耦合。

使用

  • 定义复杂的通信关系。
  • 节省开发和维护的时间。

例子

邮件列表软件通过调停者模式实现邮件发送功能,无需关心具体接收者。


Iterator 迭代子

目的

允许对聚集对象进行操作,而不依赖其内部实现。

使用

  • 需要对聚集对象进行多次或并行遍历。
  • 需要对不同聚集对象提供统一接口。

例子

Java中的迭代子模式允许遍历不同类型的集合,客户端只需与迭代子接口交互。


Memento 备忘录

目的

存储和恢复对象内部状态。

使用

  • 需要存储对象状态以备以后恢复。
  • 状态不能通过暴露实现来访问。
  • 保留对象边界。

例子

实现Undo功能时,通过序列化和反序列化对象状态。


Observer 观察者

目的

当主题对象状态变化时,通知观察者。

使用

  • 需要在对象状态变化时触发其他对象行为。
  • 需要广播通知能力。
  • 观察者代价不高。

例子

UI事件处理,如按钮点击时通知所有注册的观察者。


Strategy 策略

目的

封装不同的算法,允许动态选择算法实现。

使用

  • 类行为由运行时决定。
  • 算法需要多种版本。
  • 算法与数据解耦。

例子

数据验证时,通过策略模式选择不同的验证算法。


State 状态

目的

将对象行为与内部状态绑定。

使用

  • 行为受状态影响。
  • 状态转换显式进行。
  • 状态间需要转换。

例子

邮件对象根据状态决定是否发送或召回邮件。


Template Method 模板方法

目的

标识算法框架,允许子类实现具体行为。

使用

  • 需要算法的抽象接口。
  • 子类行为一致。
  • 父类统一调用子类行为。

例子

消息发送时,子类定义不同的序列化方式。


Visitor 访问者

目的

允许运行时对一组对象执行操作,解耦对象结构和操作。

使用

  • 对象结构需要多个操作。
  • 操作可以变化。
  • 操作必须作用于具体类。

例子

对不同地区的发票计税规则进行统一处理。


Bridge 桥梁

目的

定义抽象角色和实现角色,通过委派解耦。

使用

  • 抽象角色和实现角色在编译时解耦。
  • 允许动态更换实现角色。

例子

JVM通过桥梁模式委派本地方法。


Composite 组合

目的

将单纯元素和复合元素统一对待,方便创建对象树。

使用

  • 需要创建对象树结构。
  • 单纯元素和复合元素统一处理。

例子

购物车中混合单个项目和项目组。


Decorator 装饰

目的

动态包装对象,修改其责任和行为。

使用

  • 责任和行为可以动态修改。
  • 实现和责任解耦。
  • 不使用继承。

例子

邮件系统动态添加版权信息。


Flyweight 享元

目的

通过重用细粒度对象,提高效率。

使用

  • 对象创建代价高,存储成本高。
  • 每个对象的主要状态可以外部存放。

例子

页面布局中的对话框,共享内部状态。


Facade 门面

目的

为复杂系统提供单一接口。

使用

  • 系统和子系统之间需要分层。
  • 子系统实现细节隐藏。

例子

Web服务暴露复杂系统功能。


Proxy 代理

目的

允许对对象存取控制,作为间接引用。

使用

  • 控制对象的访问。
  • 对象可能存在于外部。
  • 动态控制访问权限。

例子

对第三方通信对象进行资源控制。


Abstract Factory 抽象工厂

目的

提供接口,委派具体工厂创建对象。

使用

  • 对象创建独立于使用系统。
  • 支持多个对象族。
  • 实现细节隐藏。

例子

邮件编辑器创建不同格式的主体对象。


Factory Method 工厂方法

目的

暴露对象创建方法,允许子类控制创建过程。

使用

  • 需要控制对象创建。
  • 子类定义具体创建逻辑。
  • 父类解耦具体实现。

例子

创建不同类型的用户对象。


Builder 建造者

目的

允许动态创建对象,根据算法选择实现。

使用

  • 算法动态替换。
  • 算法和系统解耦。
  • 新算法容易添加。

例子

文件传输协议选择不同的Builder。


Prototype 原型

目的

通过克隆现有对象创建新对象。

使用

  • 对象创建成本高。
  • 对象结构一致。
  • 克隆操作流程化。

例子

价格处理引擎的多个实例初始化。


Singleton 单例

目的

保证系统中只有一个对象实例。

使用

  • 只需一个实例。
  • 控制实例访问。

例子

操作系统中的系统对象。


这篇文章通过详细描述各大设计模式的目的、使用场景和实际例子,帮助读者理解这些模式的核心思想和应用场景。

转载地址:http://sprfk.baihongyu.com/

你可能感兴趣的文章
Mysql 表分区
查看>>
mysql 表的操作
查看>>
mysql 视图,视图更新删除
查看>>
MySQL 触发器
查看>>
mysql 让所有IP访问数据库
查看>>
mysql 记录的增删改查
查看>>
MySQL 设置数据库的隔离级别
查看>>
MySQL 证明为什么用limit时,offset很大会影响性能
查看>>
Mysql 语句操作索引SQL语句
查看>>
MySQL 误操作后数据恢复(update,delete忘加where条件)
查看>>
MySQL 调优/优化的 101 个建议!
查看>>
mysql 转义字符用法_MySql 转义字符的使用说明
查看>>
mysql 输入密码秒退
查看>>
mysql 递归查找父节点_MySQL递归查询树状表的子节点、父节点具体实现
查看>>
mysql 里对root及普通用户赋权及更改密码的一些命令
查看>>
Mysql 重置自增列的开始序号
查看>>
MySQL 错误
查看>>
MySQL 面试,必须掌握的 8 大核心点
查看>>
MySQL 高可用性之keepalived+mysql双主
查看>>
MySql-2019-4-21-复习
查看>>