ios专题iOS DeveloperiOS开发

iOS设计模式之命令模式

2017-05-30  本文已影响585人  3697d6c42285

命令模式

1、什么是命令模式

将请求封装成对象,以便使用不同的请求、日志、队列等来参数化其他对象。命令模式也支持撤销操作。

简单的命令模式有四个角色:

  1. 命令发出者
  2. 命令管理者
  3. 命令接收者
  4. 命令对象

命令管理者需要管理所有接收到的命令,并通过命令管理者执行、保存和撤销命令。
命令接收者需要实现执行的动作和撤销时候的动作。
命令对象则让接收者执行响应的操作
命令发出者则执行设置命令的参数,以及给予执行或者撤销的指令。

就如同看电视,遥控器是命令管理者,电视是命令接受者,遥控器按钮就是命令。
遥控器可以命令电视跳到下一个频道或者指定频道,也有回退到上一个频道的功能。

又或者 git 上面的操作也属于命令模式,你可以查看操作日志,也可以进行回滚,执行上传等操作。

2、命令模式用在什么地方

3、命令模式的使用

  1. 定义所有的命令模式,命令模式包括执行时所做的动作与撤销时所做的动作,并反馈给命令接受者。
  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()
    }
}
上一篇下一篇

猜你喜欢

热点阅读