美文网首页
【设计模式】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