iOS设计模式之命令模式
2017-05-30 本文已影响585人
3697d6c42285
命令模式
1、什么是命令模式
将请求封装成对象,以便使用不同的请求、日志、队列等来参数化其他对象。命令模式也支持撤销操作。
简单的命令模式有四个角色:
- 命令发出者
- 命令管理者
- 命令接收者
- 命令对象
命令管理者需要管理所有接收到的命令,并通过命令管理者执行、保存和撤销命令。
命令接收者需要实现执行的动作和撤销时候的动作。
命令对象则让接收者执行响应的操作
命令发出者则执行设置命令的参数,以及给予执行或者撤销的指令。
就如同看电视,遥控器是命令管理者,电视是命令接受者,遥控器按钮就是命令。
遥控器可以命令电视跳到下一个频道或者指定频道,也有回退到上一个频道的功能。
又或者 git 上面的操作也属于命令模式,你可以查看操作日志,也可以进行回滚,执行上传等操作。
2、命令模式用在什么地方
- 让该功能允许撤销与恢复
- 让对象参数化一个动作,并执行操作,不同的命令对象代替回调函数
- 可以对命令请求尽心执行、排序、执行等
3、命令模式的使用
- 定义所有的命令模式,命令模式包括执行时所做的动作与撤销时所做的动作,并反馈给命令接受者。
- 定义命令管理器,包括命令数组和撤销数组(如果有反撤销的需求),执行命令方法,并定义每个命令的接受者。
- 客户端通过命令管理器,定义命令接收者并操作所有的命令。
4、总结
命令模式属于偏难的一种模式,而且该模式的应用场景偏少。
好处也很明显,就是分离发出命令和执行命令,容易修改与使用。
5、demo
class Command: NSObject {
var receiver: Receiver?
init(receiver:Receiver) {
super.init()
self.receiver = receiver
}
func execute() {
}
func undo() {
}
}
class UpCommand: Command {
override func execute() {
receiver!.soundNumber += 1
}
override func undo() {
receiver!.soundNumber -= 1
}
}
class DownCommand: Command {
override func execute() {
receiver!.soundNumber -= 1
}
override func undo() {
receiver!.soundNumber += 1
}
}
class Receiver: NSObject {
var soundNumber: Int = {0}()
}
class CommandManager: NSObject {
var commandList: NSMutableArray = {NSMutableArray()}()
var command: Command?
func setCommand(command:Command) {
self.command = command
}
func execute() {
if (self.command != nil) {
self.command!.execute()
commandList.add(self.command!)
}
}
func undo() {
if self.commandList.count > 0 {
let command = self.commandList.lastObject as! Command
command.undo()
self.commandList.removeLastObject()
}
}
}
class Client: NSObject {
func begin() {
let receiver = Receiver()
receiver.soundNumber = 15
let upCommand = UpCommand(receiver: receiver)
let manager = CommandManager()
manager.setCommand(command: upCommand)
manager.execute()
}
}