文章目录
面向对象设计之设计模式(行为型篇)
从大量实际行动中概括出来,作为行为的理论抽象、基本框架和标准
该类模式主要用于对象之间的职责及其提供服务的分配,它不仅描述对象或类的模式,还描述他们之间的通信模式
责任链模式(Chain of Responsibility)
当你想让一个以上的对象都有机会处理请求的时候
优点
- 降低耦合度
- 增加想对象指定责任的灵活性
使用场景
- 多个对象可以处理一个请求,而其处理器确实未知的
- 可以动态指定能够处理请求的对象集
命令模式(Command)
在对象中封装请求,保存命令并传递给方法以及像任何其他对象一样返回该命令
优点
- 增加新命令不用修改已有类
- 将操作对象与指导如何完成操作的对象相分离
适用场景
- 想要通过要执行的动作来参数化对象
- 在不同的时间指定、排序以及执行请求
解释器模式(Interpreter)
解释定义其语法表示的语言
优点
- 容易修改并扩展语法
- 容易实现语法
适用场景
- 语言的语法比较简单
- 效率并不是最主要的问题
迭代器模式(Iterator)
提供一种方法顺序地访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示
优点
- 支持集合的不同遍历
- 简化集合接口
适用场景
- 在不开放集合对象内部表示的前提下,访问集合对象内容
- 支持集合对象的多重遍历
- 为便利集合中的不同结构提供了统一的接口
备忘录模式(Memento)
保持对象状态的“快照”,在不想外界公开其内容的情况下返回到它的最初状态
优点
- 保持封装完整
- 简化了返回到初始状态所需的操作
适用场景
- 必须保存对象的快找
- 适用直接接口来获得状态可能会公开对象的实现细节,从而破坏对象的封装性
观察者模式(Observer)
为组件向相关接收方广播消息提供了灵活的方法
优点
- 抽象了主体与 Oberserver 之间的耦合关系
- 支持广播方式的通信
适用场景
- 对一个对象修改涉及其他对象的修改,而不知道有多少对象需进行修改
状态模式(State)
允许对象在内部状态变化时变更其行为,并且修改其类
优点
- 定位指定状态的行为,并根据不同状态来划分行为
适用场景
- 对象行为依赖于其状态,且对象必须在运行时根据其状态修改行为
- 操作具有大量以及多部分组成的取决于对象状态的条件语句
策略模式(Strategy)
定义算法族,分别封装起来,让它们之间互相替换,此模式让算法的变化独立于使用算法的客户
优点
- 在类自身中定义行为,减少条件语句
- 更容易扩展模型
适用场景
- 许多相关类只是在行为方面有所区别
- 需要算法的不同变体
- 算法使用客户端未知的数据
模板方法模式(Template Method)
在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法模式使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤
对模板方法进行挂钩 – 钩子是一种被声明在抽象类中的方法,但只有空的或者默认的实现。钩子的存在,可以让子类有能力对算法的不同点进行挂钩
优点
- 容易将可变算法的替换
适用场景
- 想要一次实现算法的不变部分,适用子类实现算法的可变行为
- 子类间通用行为需要分解,定位到通用类,可以避免代码重复问题
访问者模式(Visitor)
当你想为一个对象的组合增加新的功能,且封装并不重要时,就使用访问者模式
优点
- 容易添加新操作
- 集中相关操作并且排除不相关操作
适用场景
- 定义对象结构的类很少被修改,但想要在此结构上定义新的操作
- 对象结构包含许多具有不同接口的对象类,并且想要对这些依赖于具体类的对象进行操作
中介者模式(Mediater)
通过引入一个能够管理对象间消息分布的对象,简化了系统中对象的通信
优点
- 去除对象间的影响
- 简化对象间的协议
- 集中化了控制
适用场景
- 对象集合需要以一个定义规范但复杂的方式进行通信
- 想要在不使用子类的情况下自定义分布在几个对象之间的行为