7.
oo模式:命令模式——將「請求」封裝成物件,以便使用不同的請求、佇列或者日誌來引數化其他物件。命令模式也支援可撤銷的操作。
例子:通過遙控器控制家具的狀態(暫定該遙控器有7個插槽,乙個插槽控制乙個家具,插槽上控制的家具可以隨時更換;每個插槽有兩個按鈕,分別控制「開」和「關」)
//// this is the invoker
//public class remotecontrol ;
offcommands[i] = () -> ;
} }public void setcommand(int slot, command oncommand, command offcommand)
public void onbuttonwaspushed(int slot)
public void offbuttonwaspushed(int slot)
public string tostring()
return stringbuff.tostring();
}}
public inte***ce command
public class lightpublic void on()
public void off()
}
public class lightoffcommand implements commandpublic void execute()
}
public class lightoncommand implements commandpublic void execute()
}
public class remoteloader(上述**只寫出了light和light的相關命令,其他的家具也類似,這裡不一一列出)}
以下是上述類的關係圖:
仔細檢視以上**,你會發現,插槽4和6是沒有搭載命令的,那如果此時按鈕按下怎麼辦?
方法一:將onbuttonwaspushed()做如下改變:
public void onbuttonwaspushed(int slot) }
你能想到其他方法嗎?
方法二:我們新增乙個nocommand類實現command介面
public class nocommand implements command此處用到了空物件,也被視為一種設計模式。它將處理null的責任轉移給了空物件。例如遙控器出廠的時候可能沒有設定任何有意義的命令物件,所以提供了nocommand物件作為代用品,當呼叫他的excute()方法時,這種物件就什麼都不做。}
看到測試**那一堆開和關的命令我就感覺很麻煩,不是同乙個家具嗎,直接合起來不就好了?
所以我個人認為,此處還可以做出一些改進:
例如:將command做如下更改,將開和關都放在commands介面裡,
public inte***ce commands
因此,實現時也要做出改變,用燈做例子,就是用「燈命令集」來實現「命令集」
public class lightcommands implements commands
public void executeon()
public void executeoff()
}
remotecontrol類做一點小改變:
public void onbuttonwaspushed(int slot)這樣的話,測試的時候就可以減少一半**,相關實現類也能減少一半public void offbuttonwaspushed(int slot)
所以當新增乙個家具時,只需給遙控器乙個家具廠商提供乙個***commands集,遙控器就能控制該家具,而不需要改任何**!!!
設計模式 命令設計模式
一句話總結 命令設計模式的實質是將命令定義,命令的執行分離開,從而提公升了系統的解藕性 結構 命令的抽象command 命令的具體實現concretecommand 命令處理者抽象ireceiver 命令處理者的具體實現concretereceiver 命令的呼叫者invoker 客戶端client...
設計模式 命令模式
1 命令模式的角色組成 1 命令角色 command 生命執行操作的介面。介面或抽象類來實現。2 具體命令角色 concrete command 將乙個接收者物件繫結於乙個動作 呼叫接收者相應的操作,以實現命令角色宣告的執行操作的介面。3 客戶角色 client 建立乙個具體命令物件 並可以設定它的...
設計模式 命令模式
1 command.h ifndef command h define command h include include include using namespace std class chef 廚師,具體命令的執行者 class command 命令基類 class makemuttonco...