Swift-命令模式

作者: FlyElephant | 来源:发表于2017-05-10 18:02 被阅读80次

    命令模式是解决了命令的请求者和命令的实现者之间的耦合关系,命令的扩展性,命令的统一性(队列、撤销/恢复、记录日志等等),命令模式有五个重要的对象Command,ConcreteCommand,Receiver,Invoker与Client.

    ① 抽象命令(Command):定义命令的接口,声明执行的方法.
    ② 具体命令(ConcreteCommand):具体命令,实现要执行的方法,它通常是“虚”的实现;通常会有接收者,并调用接收者的功能来完成命令要执行的操作.
    ③ 接收者(Receiver):真正执行命令的对象。任何类都可能成为一个接收者,只要能实现命令要求实现的相应功能.
    ④ 调用者(Invoker):要求命令对象执行请求,通常会持有命令对象,可以持有很多的命令对象。这个是客户端真正触发命令并要求命令执行相应操作的地方,也就是说相当于使用命令对象的入口.
    ⑤ 客户端(Client):命令由客户端来创建,并设置命令的接收者.

    命令模式.jpg

    生活中的洗衣机洗衣服的场景比较符合命令模式,实现如下:
    洗衣机:
    <pre><code>`class WashMachine {

    func wash() {
        print("洗衣服")
    }
    
    func dry() {
        print("脱水")
    }
    
    func unWash() {
        print("终止洗衣服")
    }
    

    }`</code></pre>

    命令:
    <pre><code>`class Command {

    func execute() { }
    
    func undo() { }
    

    }

    class WashCommand: Command {

    var washMachine:WashMachine?
    
    convenience init(machine:WashMachine) {
        self.init()
        washMachine = machine
    }
    
    override func execute() {
        washMachine?.wash()
        washMachine?.dry()
    }
    
    override func undo() {
        washMachine?.unWash()
    }
    

    }`</code></pre>

    执行者:
    <pre><code>`class Person {

    var commands:[Command] = []
    
    func addCommand(command:Command) {
        commands.append(command)
    }
    
    func executeCommand(index:Int) {
        
        let command:Command? = commands[index]
        command?.execute()
    }
    
    func undoCommand(index:Int) {
        let command:Command? = commands[index]
        command?.undo()
    }
    

    }`</code></pre>

    测试代码:
    <pre><code>` @IBAction func executeAction(_ sender: UIButton) {
    self.person?.executeCommand(index: 0)
    }

    @IBAction func cancelAction(_ sender: UIButton) {
        self.person?.undoCommand(index: 0)
        print("简书---FlyElephant")
    }
    
    
    func setUp() {
        
        let machine:WashMachine = WashMachine()
        let washCommand:WashCommand = WashCommand(machine: machine)
        
        self.person = Person()
        self.person?.addCommand(command: washCommand)
    }`</code></pre>
    
    FlyElephant.png

    命令模式对功能方法的抽象提升到对象层面来实现,降低了系统的耦合度,比较常见的场景是队列,日志,很容易将各种命令组合实现业务需求.

    命令模式的缺点非常明显,一个命令绑定一个命令执行者,如果业务较复杂,会导致过多的具体命令类.

    相关文章

      网友评论

        本文标题:Swift-命令模式

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