Head First 設計模式筆記 5 命令模式

2021-10-13 17:46:28 字數 1723 閱讀 1423

小明接到了新任務,要求設計乙個遙控器,這個遙控器上面有七個插槽,每個插槽都有對應的開和關按鈕。要求每個都能控制任意家電如燈,電視,電風扇,門等等。以下是這些家電的類圖

圖1 家具的類圖

小明本想用if-else語句進行判斷插槽slot上面的物件,在進行的對應,如

if

(slot == light)

light.on(

)else

if(slot == sprinkler)

sprinkler.on(

)

但是很快小明就發現了問題。

小明發現,問題的關鍵在於,動作請求者和動作執行者緊緊地**在了一起。請求者就是遙控器,執行者就是各種家電。能不能找個中間商,協調一下兩者呢?

小明查閱了設計模式葵花寶典後,發現還真的有個命令模式,可以完美地實現動作請求者和動作執行者解耦的問題。在命令模式中,請求或者說命令被視為一種物件,用於溝通動作請求者和動作執行者。它具有以下幾個角色

基本流程是,請求物件建立乙個命令物件,之後將命令物件儲存在invoker中,之後,客戶通過invoker執行命令。

它的類圖如圖所示

圖2 命令模式的類圖

掌握了命令模式後,小明就可以根據按照套路進行設計了。

命令物件的設計

先來乙個命令介面

public

inte***ce

command

再來乙個控制燈泡開啟的具體命令

public

class

lightoncommand

implements

command

public

void

execute()

}

遙控器的設計這裡我們設計乙個最簡單的遙控器,它只有乙個插槽,負責開啟乙個裝置。

public

class

******remotecontrol

public

void

setcommand

(command command)

public

void

buttonwaspressed()

}

簡單測試最後,來乙個簡單的測試。

public

class

remotecontroltest

}

在上述的具體實現中,remote就是invoker,而command對應command,而remotecontroltest代表client,最後light則是reciever。

佇列請求

命令模式可以處理佇列請求,假設有乙個工作佇列,客戶在一端新增命令,然後另外一端是執行緒,執行緒在佇列中取出乙個命令,呼叫它的execute方法,等待這個呼叫完成,然後將這個命令物件拋棄,再取出下乙個命令。

日誌請求

Head First 設計模式筆記

將變化部分和不變部分分離出來,讓 適應變化 封裝變化 針對介面程式設計,而不是針對實現程式設計 即,將一類行為抽象成行為類介面,可以應對變化,符合原則1 多用組合,少用繼承 這條原則,是建立在原則2的基礎上的,好處是系統有很大的彈性,執行時可以動態改變物件的行為 例如 策略模式 定義演算法簇 學會使...

Head First 設計模式筆記

1.找出應用中可能變化的地方,將它們獨立出來。不要和那些不需要變化的部分混在一起 2.針對介面程式設計,而不是針對實現程式設計 針對 介面程式設計 的意思是 針對超型別程式設計 針對介面程式設計關鍵在於多型。利用多型程式設計師可以針對超型別程式設計,編譯器執行會根據實際情況執行到真正的行為,而不會將...

head first 設計模式 工廠模式筆記

工廠模式 是舉了個做pizza的例子 有pizzastore抽象類裡邊有個pizza物件變數,orderpizza中裡面有個方法 叫做createpizza,同時外面定義了乙個createpizza抽象方法,然後實現裡面有個方法 叫做createpizza,此方法更具不同的引數new不同的對 象,如...