資源描述:
《c23種設(shè)計模式8命令模式》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、命令模式(CommandPattern)耦合與變化:???耦合是軟件不能抵御變化災(zāi)難的根本性原因。不僅實體對象與實體對象之間存在耦合關(guān)系,實體對象與行為操作之間也存在耦合關(guān)系。????????????????????????????????????????????????????????????????????????????????????????????動機(Motivate):???在軟件系統(tǒng)中,“行為請求者”與“行為實現(xiàn)者”通常呈現(xiàn)一種“緊耦合”。但在某些場合,比如要對行為進行“記錄、撤銷/重做
2、、事務(wù)”等處理,這種無法抵御變化的緊耦合是不合適的。???在這種情況下,如何將“行為請求者”與“行為實現(xiàn)者”解耦?將一組行為抽象為對象,可以實現(xiàn)二者之間的松耦合。意圖(Intent):???將一個請求封裝為一個對象,從而使你可用不同的請求對客戶進行參數(shù)化;對請求排隊或記錄請求日志,以及支持可撤消的操作。?????????????????????????????????????????????????-------《設(shè)計模式》GOF結(jié)構(gòu)圖(Struct):???????????適用性:1.使用命令模式作為
3、"CallBack"在面向?qū)ο笙到y(tǒng)中的替代。"CallBack"講的便是先將一個函數(shù)登記上,然后在以后調(diào)用此函數(shù)。2.需要在不同的時間指定請求、將請求排隊。一個命令對象和原先的請求發(fā)出者可以有不同的生命期。換言之,原先的請求發(fā)出者可能已經(jīng)不在了,而命令對象本身仍然是活動的。這時命令的接收者可以是在本地,也可以在網(wǎng)絡(luò)的另外一個地址。命令對象可以在串形化之后傳送到另外一臺機器上去。3.系統(tǒng)需要支持命令的撤消(undo)。命令對象可以把狀態(tài)存儲起來,等到客戶端需要撤銷命令所產(chǎn)生的效果時,可以調(diào)用undo()方
4、法,把命令所產(chǎn)生的效果撤銷掉。命令對象還可以提供redo()方法,以供客戶端在需要時,再重新實施命令效果。4.如果一個系統(tǒng)要將系統(tǒng)中所有的數(shù)據(jù)更新到日志里,以便在系統(tǒng)崩潰時,可以根據(jù)日志里讀回所有的數(shù)據(jù)更新命令,重新調(diào)用Execute()方法一條一條執(zhí)行這些命令,從而恢復(fù)系統(tǒng)在崩潰前所做的數(shù)據(jù)更新。生活中的例子:????Command模式將一個請求封裝為一個對象,從而使你可以使用不同的請求對客戶進行參數(shù)化。用餐時的賬單是Command模式的一個例子。服務(wù)員接受顧客的點單,把它記在賬單上封裝。這個點單被排
5、隊等待烹飪。注意這里的"賬單"是不依賴于菜單的,它可以被不同的顧客使用,因此它可以添入不同的點單項目。??????????????????代碼實現(xiàn):???在眾多的設(shè)計模式中,Command模式是很簡單也很優(yōu)雅的一種設(shè)計模式。Command模式它封裝的是命令,把命令發(fā)出者的責(zé)任和命令執(zhí)行者的責(zé)任分開。我們知道,一個類是一組操作和相應(yīng)的一些變量的集合,現(xiàn)在有這樣一個類Document,如下:????????????????????????????????????1?///??2??3?//
6、/?文檔類?4??5?///??6??7?public?class?Document?8??9?{10?????/**////?11?12?????///?顯示操作13?14?????///?15?16?????public?void?Display()17?18?????{19?????????Console.WriteLine("Display");20?????}?21?22?????/**////?23?24?????/
7、//?撤銷操作25?26?????///?27?28?????public?void?Undo()29?30?????{31?????????Console.WriteLine("Undo");32?????}33?34?????/**////?35?36?????///?恢復(fù)操作37?38?????///?39?40?????public?void?Redo()41?42?????{43?????????Console.WriteLine("R
8、edo");44?????}45?}通??蛻舳藢崿F(xiàn)代碼如下:???1?class?Program?2??3?{?4?????static?void?Main(string[]?args)?5??6?????{?7?????????Document?doc?=?new?Document();?8??9?????????doc.Display();10?11?????????doc.Undo();12?13?????????doc.Redo()