iOS设计模式之命令模式

作者: 3697d6c42285 | 来源:发表于2017-05-30 19:34 被阅读585次

    命令模式

    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()
        }
    }
    

    相关文章

      网友评论

      • 9a957efaf40a:你好,我请请教下,AFNetworking中使用请求,最后的几个回调block会组成一个对象AFURLSessionManagerTaskDelegate。这里面是使用的命令模式吗?因为我看了下AFHTTPSessionManager直接持有这几个回调也可以,只是请求完成需要把回调置为nil,以断开循环引用。AFN采用的是生成一个对象,对象有这些block属性,AFHTTPSessionManager通过字典保存这个对象,请求完成从字典移除这个对象就完成了。
        这种属于命令模式吗?

      本文标题:iOS设计模式之命令模式

      本文链接:https://www.haomeiwen.com/subject/aypixxtx.html