美文网首页
【设计模式】20 - 命令模式 (Command Pattern

【设计模式】20 - 命令模式 (Command Pattern

作者: Lebron_James | 来源:发表于2019-05-07 00:03 被阅读0次

    这篇文章是我阅读raywenderlich.comDesign Patterns by Tutorials的总结,文中的代码是我阅读书本之后根据自己的想法修改的。如果想看原版书籍,请点击链接购买。


    命令模式属于行为模式,他把命令的相关信息封装到一个命令对象里。这个模式设计三个类型:

    • Invoker:存储并执行命令。
    • Command:封装命令的具体行为。
    • Receiver:接收命令的对象。

    什么时候使用

    当我们要创建可以让不同的Receivers接收的行为时,使用命令模式。

    简单demo

    现在的小区房,一般都有保安在看门,我们就保安开关门为例:1)因为保安是执行开门命令的人,所以是 Invoker;2)封装了如何开门的对象就是 Command,;3)接受命令的就是门,所以门是 Receiver。

    Command 和 Receiver

    这里,我们把封装如何开门的类命名为 DoorCommand;Receiver 命名为Door

    final class Door {
        var isOpen = false
    }
    
    class DoorCommand {
        let door: Door
        init(door: Door) { self.door = door }
        func execute() {}
    }
    
    final class OpenCommand: DoorCommand {
        override func execute() {
            print("正在开门")
            door.isOpen = true
        }
    }
    
    final class CloseCommand: DoorCommand {
        override func execute() {
            print("正在关门")
            door.isOpen = false
        }
    }
    
    1. 首先定义了Door,只有一个属性isOpen;2) DoorCommand作为一个基类,持有door属性,还有一个命令执行的方法excecute();3) 分别创建开门和关门的命令。

    Invoker

    final class Doorman {
        let door: Door
        
        let closeCommand: CloseCommand
        let openCommand: OpenCommand
        
        init(door: Door) {
            closeCommand = CloseCommand(door: door)
            openCommand = OpenCommand(door: door)
            self.door = door
        }
        
        func closeDoor() {
            closeCommand.execute()
        }
        
        func openDoor() {
            openCommand.execute()
        }
    }
    

    这里定义了Doorman,角色属于 Invoker,持有Door和开关门的命令,另外还定义了发送开关门命令的方法。

    使用

    let door = Door()
    let doorman = Doorman(door: door)
    
    doorman.openDoor()
    doorman.closeDoor()
    
    // 结果
    正在开门
    正在关门
    

    创建Door 和 Doorman,然后 Doorman 发送开关门的命令。

    总结

    命令模式会产生很多命令对象,最终可能导致代码很难维护。所以,如果我们的命令不需要稍后执行,直接调用 Recevier 的方法即可。

    欢迎加入我管理的Swift开发群:536353151

    下一篇文章:【设计模式】21 - 责任链模式 (Chain-of- Responsibility Pattern)

    相关文章

      网友评论

          本文标题:【设计模式】20 - 命令模式 (Command Pattern

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