本文共 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 单例
目的
保证系统中只有一个对象实例。
使用
- 只需一个实例。
- 控制实例访问。
例子
操作系统中的系统对象。
这篇文章通过详细描述各大设计模式的目的、使用场景和实际例子,帮助读者理解这些模式的核心思想和应用场景。
发表评论
最新留言
关于作者