Head First設計模式之命令模式
一、定義
定義:將一個請求封裝成一個對象,從而使您可以用不同的請求對客戶進行參數化。對請求排隊或記錄請求日志,以及支持可撤消的操作。
主要解決:在軟件系統中,行為請求者與行為實現者通常是一種緊耦合的關系,但某些場合,比如需要對行為進行記錄、撤銷或重做、事務等處理時,這種無法抵御變化的緊耦合的設計就不太合適。
何時使用:在某些場合,比如要對行為進行"記錄、撤銷/重做、事務"等處理,這種無法抵御變化的緊耦合是不合適的。在這種情況下,如何將"行為請求者"與"行為實現者"解耦?將一組行為抽象為對象,可以實現二者之間的松耦合。
如何解決:通過調用者調用接受者執行命令,順序:調用者→接受者→命令。
二、結構

從命令模式的結構圖可以看出,它涉及到五個角色,它們分別是:
- 客戶角色:發出一個具體的命令并確定其接受者。
- 命令角色:聲明了一個給所有具體命令類實現的抽象接口
- 具體命令角色:定義了一個接受者和行為的弱耦合,負責調用接受者的相應方法。
- 請求者角色:負責調用命令對象執行命令。
- 接受者角色:負責具體行為的執行。
三、適用場景
認為是命令的地方都可以使用命令模式,比如: 1、GUI 中每一個按鈕都是一條命令。 2、模擬 CMD。
四、優缺點
優點: 1、降低了系統耦合度。 2、新的命令可以很容易添加到系統中去。
缺點:使用命令模式可能會導致某些系統有過多的具體命令類。
五、實現
/// <summary> /// 電視機 /// </summary> public class Television { /// <summary> /// 模式是關閉的 /// </summary> bool isopen = false; /// <summary> /// 切換關閉、打開 /// </summary> public string Switch() { if (isopen) { isopen = false; return "關閉電視機"; } else { isopen = true; return "打開電視機"; } } } /// <summary> /// 命令接口 /// </summary> public interface CommandInterface { /// <summary> /// 執行命令 /// </summary> string Execute(); } /// <summary> /// 電視機命令對象 /// </summary> public class TeleisionCommand : CommandInterface { /// <summary> /// 電視機對象 /// </summary> private Television Tv = new Television(); #region CommandInterface 成員 /// <summary> /// 執行命令 /// </summary> public string Execute() { return Tv.Switch(); } #endregion } /// <summary> /// 控制中心 /// </summary> public static class ControlContent { private static CommandInterface Command; public static void SetControlObjectCommand(CommandInterface cobject) { Command = cobject; } public static string ExecuteControlObject() { return Command.Execute(); } } class Program { static void Main(string[] args) { TeleisionCommand tvcommand = new TeleisionCommand(); ControlContent.SetControlObjectCommand(tvcommand); Console.WriteLine(ControlContent.ExecuteControlObject()); Console.WriteLine(ControlContent.ExecuteControlObject()); Console.ReadLine(); } }
參考
http://wangqingpei557.blog.51cto.com/1009349/626464/
http://www.runoob.com/design-pattern/command-pattern.html
歡迎閱讀本系列文章:Head First設計模式之目錄

浙公網安備 33010602011771號