本文是對(duì)Design Patterns implemented in Swift 3.0的解讀和翻譯,通過(guò)這些案例對(duì)Swift中的設(shè)計(jì)模式進(jìn)行總結(jié)和加深理解。
本文示例代碼都是在Xcode的Playground上運(yùn)行的。
命令模式(Command Pattern)
命令模式屬于行為型模式,對(duì)象的請(qǐng)求可以被看做為一個(gè)命令,將命令包裹到對(duì)象中,這個(gè)調(diào)用對(duì)象則可以尋求處理命令的接收對(duì)象。命令的接收對(duì)象則是獨(dú)立的。
原理:調(diào)用對(duì)象對(duì)接收對(duì)象發(fā)送命令,接收對(duì)象負(fù)責(zé)命令的具體執(zhí)行。
目的:將請(qǐng)求與接收進(jìn)行解耦,提高命令代碼的復(fù)用性。
示例說(shuō)明:
門作為指令調(diào)用對(duì)象,“開”和“關(guān)”作為兩個(gè)命令,分別由
OpenCommand和CloseCommand兩個(gè)接收對(duì)象負(fù)責(zé)執(zhí)行。
示例:
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()
}
}
調(diào)用及結(jié)果:
let podBayDoors = "Pod Bay Doors"
let doorModule = HAL9000DoorsOperations(doors:podBayDoors)
doorModule.open() // "Opened Pod Bay Doors"
doorModule.close() //"Closed Pod Bay Doors"
示例分析:
- 抽象化命令對(duì)象,
OpenCommand類和CloseCommand類均遵守DoorCommand協(xié)議,作為命令的接收者,它們都實(shí)現(xiàn)了執(zhí)行命令的execute方法。 -
HAL9000DoorsOperations是命令調(diào)用的具體類,該類將“開”“關(guān)”請(qǐng)求以命令的形式傳給具體的接收者去執(zhí)行。
小結(jié):
如果我們需要“推”“拉”請(qǐng)求,我們可以很容易的封裝“推”“拉”命令的接收者,然后為HAL9000DoorsOperations類添加推拉命令。如果我們有另一種“門”,也可以很方便的給其添加所需要的命令,而命令的接收者則不需要任何改變。這就是命令模式的好處,“門”本身不再負(fù)責(zé)具體“開關(guān)”的請(qǐng)求處理,而是向可以處理“開關(guān)”的對(duì)象發(fā)送命令。這樣我們可以將命令的接收者分離出來(lái),繼而可以復(fù)用它們。大大降低了系統(tǒng)的耦合度和靈活性。