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