这篇文章是我阅读raywenderlich.com的Design 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
}
}
- 首先定义了
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
。
网友评论