目录
策略模式
定义
策略模式是一种行为型模式,它将对象和行为分开,将行为定义为一个行为接口和具体行为的实现。策略模式最大的特点是行为的变化,行为之间可以相互替换。每个if 判断都可以理解为就是一个策略。本模式使得算法可独立于使用它的用户而变化。
类图
角色
- Strategy: 抽象策略类:策略是一个接口,该接口定义若干个算法标识,即定义了若干个抽象方法
- Context:环境类/上下文类:
- 上下文是依赖于接口的类,即上下文包含用策略(接口)声明的变量
- 上下文提供一个方法,持有一个策略类的引用,最终给客户端调用。该方法委托策略变量调用具体策略所实现的策略接口中的方法
- ConcreteStrategy:具体策略类:具体策略是实现策略接口的类。具体策略实现策略接口所定义的抽象方法,即给出算法标识的具体方法
优缺点
- 优点
- 策略模式提供了对“开闭原则"的完美支持,用户可以在不修改原有系统的基础上选择算法或行为,也可以灵活地增加新的算法或行为。
- 策略模式提供了管理相关的算法族的办法
- 策略模式提供了可以替换继承关系的办法
- 使用策略模式可以避免使用多重条件转移语句
- 缺点
- 客户端必须知道所有的策略类,并自行决定使用哪一个策略类
- 策略模式将造成产生很多策略类,可以通过使用享元模式在一定程度上减少对象的数量
使用场景
- 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为
- 一个系统需要动态地在几种算法中选择一种
- 如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现
- 不希望客户端知道复杂的,与算法相关的数据结构,在具体策略类中封装算法和相关的数据结构,提高算法的保密性与安全性
命令模式
定义
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;可以对请求排队或记录请求日志,以及支持可撤销的操作;
为了降低系统的耦合度,将请求的发送者和接收者解耦;在命令模式中,发送者与接收者之间引入了新的命令对象,将发送者的请求封装在命令对象中,再通过命令对象来调用接收者的方法;
类图
角色
接收者(Receiver):负责具体执行一个请求;
命令角色(ICommand):定义需要执行的所有命令行为;
具体的命令角色(ConcreteCommand):内部维护一个 Receiver,具体的命令,实现命令接口;
请求者角色(invoker):接收客户端的命令,并执行命令;
优缺点
优点
通过引入命令的抽象接口,实现了命令请求与实现的解耦;
拓展性良好,可以很容易的增加新命令;增加或删除命令非常方便。采用命令模式增加与删除命令不会影响其他类,它满足“开闭原则”对拓展比较灵活
可以实现宏命令,命令模式与组合模式结合,将多个命令装配成一个组合命令,即宏命令;
方便实现Undo,Redo 操作。命令模式可以与后面介绍的备忘录模式结合,实现命令的撤销与恢复;
缺点
命令类可能过多
使用场景
系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互
系统需要在不同的时间指定请求,将请求排队和执行请求
系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作
使用案例
Runable