Swift中設(shè)計(jì)模式的實(shí)踐二:命令模式

本文是對(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è)命令,分別由OpenCommandCloseCommand兩個(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"

示例分析:

  1. 抽象化命令對(duì)象,OpenCommand類和CloseCommand類均遵守DoorCommand協(xié)議,作為命令的接收者,它們都實(shí)現(xiàn)了執(zhí)行命令的execute方法。
  2. 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)的耦合度和靈活性。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1 場(chǎng)景問(wèn)題# 1.1 如何開機(jī)## 估計(jì)有些朋友看到這個(gè)標(biāo)題會(huì)非常奇怪,電腦裝配好了,如何開機(jī)?不就是按下啟動(dòng)按...
    七寸知架構(gòu)閱讀 2,882評(píng)論 1 59
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,533評(píng)論 19 139
  • 國(guó)家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說(shuō)閱讀 12,332評(píng)論 6 13
  • 目錄 本文的結(jié)構(gòu)如下: 什么是命令模式 為什么要用該模式 模式的結(jié)構(gòu) 代碼示例 優(yōu)點(diǎn)和缺點(diǎn) 適用環(huán)境 模式應(yīng)用 總...
    w1992wishes閱讀 1,233評(píng)論 2 9
  • 1.感賞兒子能認(rèn)真完成老師的作業(yè),做作業(yè)不讓家長(zhǎng)操心。 2.感賞兒子性格平和,和同學(xué)相處很好。 3.感賞兒子老師能...
    扮好自己的角色閱讀 143評(píng)論 1 2

友情鏈接更多精彩內(nèi)容