設計模式 命令模式

2021-08-04 21:38:49 字數 2184 閱讀 1317

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 light 

public void on()

public void off()

}

public class lightoffcommand implements command 

public void execute()

}

public class lightoncommand implements command 

public 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...