本文是对Design Patterns implemented in Swift 3.0的解读和翻译,通过这些案例对Swift中的设计模式进行总结和加深理解。
本文示例代码都是在Xcode的Playground
上运行的。
命令模式(Command Pattern)
命令模式属于行为型模式,对象的请求可以被看做为一个命令,将命令包裹到对象中,这个调用对象则可以寻求处理命令的接收对象。命令的接收对象则是独立的。
原理:调用对象对接收对象发送命令,接收对象负责命令的具体执行。
目的:将请求与接收进行解耦,提高命令代码的复用性。
示例说明:
门作为指令调用对象,“开”和“关”作为两个命令,分别由
OpenCommand
和CloseCommand
两个接收对象负责执行。
示例:
protocol DoorCommand {
func execute() -> String
}
class OpenCommand : DoorCommand {
let doors:String
required init(doors: String) {
self.doors = doors
}
func execute() -> String {
return "Opened \(doors)"
}
}
class CloseCommand : DoorCommand {
let doors:String
required init(doors: String) {
self.doors = doors
}
func execute() -> String {
return "Closed \(doors)"
}
}
class HAL9000DoorsOperations {
let openCommand: DoorCommand
let closeCommand: DoorCommand
init(doors: String) {
self.openCommand = OpenCommand(doors:doors)
self.closeCommand = CloseCommand(doors:doors)
}
func close() -> String {
return closeCommand.execute()
}
func open() -> String {
return openCommand.execute()
}
}
调用及结果:
let podBayDoors = "Pod Bay Doors"
let doorModule = HAL9000DoorsOperations(doors:podBayDoors)
doorModule.open() // "Opened Pod Bay Doors"
doorModule.close() //"Closed Pod Bay Doors"
示例分析:
- 抽象化命令对象,
OpenCommand
类和CloseCommand
类均遵守DoorCommand
协议,作为命令的接收者,它们都实现了执行命令的execute
方法。 -
HAL9000DoorsOperations
是命令调用的具体类,该类将“开”“关”请求以命令的形式传给具体的接收者去执行。
小结:
如果我们需要“推”“拉”请求,我们可以很容易的封装“推”“拉”命令的接收者,然后为HAL9000DoorsOperations
类添加推拉命令。如果我们有另一种“门”,也可以很方便的给其添加所需要的命令,而命令的接收者则不需要任何改变。这就是命令模式的好处,“门”本身不再负责具体“开关”的请求处理,而是向可以处理“开关”的对象发送命令。这样我们可以将命令的接收者分离出来,继而可以复用它们。大大降低了系统的耦合度和灵活性。