定义
命令模式是指:通过把一个请求封装成一个对象,从而可以使用不同的请求例如命令等将客户端参数化;可以将请求排队或者记录请求日志,可以支持请求撤销操作;命令模式是一个对象行为模式,别名为动作模式或者事务模式;
命令模式在将一个请求封装成一个对象后,无需了解请求激活的动作或者接收该请求后处理的细则;
这是一种两台机器之间通信性质的模式,命令模式解耦了发送者和接受者之间的联系,发送者调用一个操作,接收者执行该操作,发送者无需知道接收者对于该操作的任何接口。
结构图
单请求单接收
命令模式1.png接口说明:
- Invoker:命令调用者,它通过命令来发送请求;
- Command:抽象命令对象,它通常是一个接口或者一个抽象类,其中声明了一个execute()方法来调用命令接受者;
- ConcreteCommand:命令对象,抽象命令的实现者,其内通过会依赖一个命令接收者,该命令接收者执行具体的动作;
- Receiver: 命令接受者,它通常是命令具体执行者,其内会有一个action()方法,该方法是对请求的业务处理;
单请求多接收
命令模式-单请求多接收.png其中将多个命令封装到一个List中,从而实现一个请求将有多个接受者进行处理;
请求支持撤销动作
请求支持撤销动作.png-其中在Command方法中加入撤销动作undo(),即可实现该命令的撤销;
场景
命令模式非常类似“请求-响应”模式,因此它比较适用于日志记录,撤销操作,请求队列等场景,如以下等场景:
- 适用命令模式作为"回调(CallBack)"在面向对象系统中的替代。"CallBack"讲得便是先将一个函数登记上,然后在以后调用此函数。
- 需要在不同的事件指定请求,将请求排队。一个命令对象和命令发出者可以有不同的生命周期。换言之,原先的请求发出者可能已经不在了,而命令对象本身仍然是活动的。这时命令对象可能仍在本地,也可以在网络的另外一个地址。命令对象可以在序列化之后传送到另外一台机器上。
- 系统需要支持命令的撤销,重新执行。命令对象可以把状态存储起来,等到客户端需要撤销命令时,执行undo()方法,把命令所产生的效果撤销掉。命令对象还可以提供redo()方法,以供客户端在需要时再重新实施命令效果。
- 如果要将系统中所有数据更新到日志里,以便在系统崩溃时,可以根据日志读回所有的数据更新命令,重新调用Execute()方法一条一条执行这些命令,从而恢复系统在崩溃前所做的数据更新。
策略模式
定义
策略模式定义了一系列的算法,并且将每个算法封装成一个对象,同时这些算法还可以相互替代
结构图
策略模式.png说明:
-
Context:需要使用ConcreteStrategy提供的算法,并且其内部维护了一个Strategy的实例,同时负责动态设置运行时Strategy具体算法,还要负责Strategy之间的交互和数据传递;
-
Strategy:定义了一个公共接口,各种算法实现该接口,Context使用该接口来实现不同的算法,一般为一个抽象类或者公共接口;
-
ConcreteStrategy:算法具体实现类;
策略模式和命令模式区别
- 目标不同: 策略模式主要针对同一动作,才用不同的实现方式,而命令模式是针对不同的命令,有不同的接收者来实现;
- 主体不同:策略模式的主体是具体的应用对象,例如排序器,可以根据不同的场景才用不同的排序方式;而命令模式的主体是请求发送者和请求接受者,例如遥控器和空调,遥控器会有空凋相应的指令,来命令空调执行相应的方法;
网友评论