一:概念
将请求封装成对象,以便使用不同的请求、日志、队列等来参数化其他对象。命令模式也支持撤销操作。
二: 应用场景
在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。
三:模式中角色
3.1 抽象命令(Command):定义命令的接口,声明执行的方法。
3.2 具体命令(ConcreteCommand):具体命令,实现要执行的方法,它通常是“虚”的实现;通常会有接收者,并调用接收者的功能来完成命令要执行的操作。
3.3 接收者(Receiver):真正执行命令的对象。任何类都可能成为一个接收者,只要能实现命令要求实现的相应功能。
3.4 调用者(Invoker):要求命令对象执行请求,通常会持有命令对象,可以持有很多的命令对象。这个是客户端真正触发命令并要求命令执行相应操作的地方,也就是说相当于使用命令对象的入口。
3.5 客户端(Client):命令由客户端来创建,并设置命令的接收者。
如下图所示:
关系图就如同看电视,遥控器是命令管理者,遥控器按钮每次按下 都是创建一个命令 发给接收器。 每个电视都有一个一个接收器。接受器 和电视关联 并且可以对电视做部分的操作。
四:代码演示
DEMO 下载地址 使用 swift 语言编写。
demo - UML 图对应关系如下:
电视机 对应 viewController.view ; 接收器 对应 receiver
遥控器 对应 Invoker 负责 生成命令 rollBack 操作。
每个 具体的命令 都是通过 执行 CommandProtocol 来处理。
完整的调用看 DEMO 中的这里抽取 关键的代码
1.0 Receiver
receiver=Receiver();
receiver?.clientView=self.view
2.0 Invoker
//
varqueue:NSMutableArray=NSMutableArray()
// swift 中单例的初始化方法 有点特别
staticletsharedInstance:Invoker= {
letsharedInstance =Invoker();
returnsharedInstance;
}()
// commandProtocol 的情况
publicfuncaddAndExecute(command:CommandProtocol){
//
self.queue.add(command)
command.execute()
}
publicfuncrollBack(){
ifself.queue.count>0{
letcommand:CommandProtocol=self.queue.lastObjectas!CommandProtocol
command.rollBackExecute()
self.queue.removeLastObject()
}
}
3.0 DarkerCommand
classDarkerCommand:NSObject,CommandProtocol{
weakvarreceiver:Receiver?
varparamter:CGFloat?
init(receiver:Receiver,paramter:CGFloat) {
super.init();
self.receiver= receiver;
self.paramter= paramter;
}
funcexecute() {
self.receiver?.makeDark(paramter:paramter!)
}
funcrollBackExecute() {
self.receiver?.makeLighter(paramter:paramter!)
}
}
网友评论