溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

.NET簡談設計模式之(命令模式)

發(fā)布時間:2020-06-25 21:41:51 來源:網絡 閱讀:2222 作者:王清培 欄目:編程語言

我們繼續(xù)學習設計模式系列文章。

本篇要講的是命令模式,其實命令模式也比較好理解,沒有用到多高深的技術,也不需要多復雜的抽象。只需要我們腦海里能有一個大概的原型,等我們遇見類似問題的時候我們能通過巧妙的方式來解決。我們做應用層開發(fā)的大部分接觸的都是一些模式、框架、思想等等,不像搞低層開發(fā)的,他們研究的可能多數是一些技術實現的問題,而我們是學習實現的方法論。應用層開發(fā)在技術的復雜程度上是有限的,在組合技術的實現上是復雜的。所以有一些.NET架構師確實比較厲害,他們能很早的就料到會出現什么問題,他們有很強的架構思想,對設計模式的掌握、對架構設計思想、對敏捷、極限等等都有了解,將它們化為一體,才能設計出非常漂亮的開發(fā)架構。[王清培版權所有,轉載請給出署名]

[NET架構師也是我們每一個NET程序員夢寐以求的歸屬,我們向著這個目標努力吧。加油!]

命令模式:將調用封裝成命令對象,通過命令對象進行調用,很好的消除調用者與被調用者之間的耦合。

這是我對命令模式的理解,定義有很多種,側重點不同,理解就行了。我們引入問題,帶著問題來學習模式能很好的“消化吸收”。

現在移動終端越來越流行,IPAD、IPHONE、家用設備等等,這是計算機發(fā)展的一種趨勢,更是人類生活質量的重大提升,有了計算機所有的東西都是信息化、數字化、科技化,不用出門都能買東西,不用到家都能自動打開熱水器燒水,不用動手都能吃到飯。看來我們選擇軟件開發(fā)是沒錯的,至少我們能改善自己的生活環(huán)境。

我們來改善一下我們自己的家庭環(huán)境,使用全數字化,用一個移動終端來控制家里的所有的電子設備,比如微波爐、熱水器、電視機、冰箱等等。只要是智能設備我們都能控制。

[軟件是對硬件編程,使用軟件來編寫硬件處理邏輯]

我們假設這個終端設備叫做家庭設備控制中心,我們要開發(fā)一個這樣的設備來對所有的這些家用電器進行控制,但是這些家用電子各種各樣,不管是從造型上還是內部實現上都有千差萬別,想要用這個終端進行統(tǒng)一的控制似乎不太容易。這個終端不是死的,家用電子可能會隨著時間的長久而損壞,當我們更換新的家用電器時,我們的終端要能一樣工作,只需要簡單的配置一下就能控制新的電器。[王清培版權所有,轉載請給出署名]

所以這里引入了兩個問題,第一個是控制終端不能隨著家用電器的變化而改動,第二個是不可能每個家用電器都按照終端的規(guī)定進行制造。我們需要有一種辦法來解決這矛盾的局面。救命稻草來了,我們可以運用“命令模式”的思想來解決這種矛盾的局面。

我們先來看一個命令模式的大概流程圖。

1:

.NET簡談設計模式之(命令模式)

在這種情況下,調用者與被調用者都不需要改動,只需要在這兩者之間加上命令對象來傳達這種調用者吩咐的命令就行了。

家用終端可能有多個按鈕,每個按鈕控制不同的電器,我們只需要將上圖的原理帶入到終端中就行了。

2:

.NET簡談設計模式之(命令模式)

這樣就可以用一個遙控器來控制任意的電器設備了。我們來看看代碼是怎么實現的,當然實現的方式有很多種,每種各有優(yōu)缺點,本篇文章以入門為主。

電視機代碼:

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Text;  
  4.  
  5. namespace ConsoleApplication1  
  6. {  
  7.     /// <summary>  
  8.     /// 電視機  
  9.     /// </summary>  
  10.     public class Television  
  11.     {  
  12.         /// <summary>  
  13.         /// 模式是關閉的  
  14.         /// </summary>  
  15.         bool isopen = false;  
  16.         /// <summary>  
  17.         /// 切換關閉、打開  
  18.         /// </summary>  
  19.         public string Switch()  
  20.         {  
  21.             if (isopen)  
  22.             {  
  23.                 isopen = false;  
  24.                 return "關閉電視機";  
  25.             }  
  26.             else 
  27.             {  
  28.                 isopen = true;  
  29.                 return "打開電視機";  
  30.  
  31.             }  
  32.         }  
  33.  
  34.     }  
  35. }  

電視機命令對象代碼:

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Text;  
  4.  
  5. namespace ConsoleApplication1  
  6. {  
  7.     /// <summary>  
  8.     /// 電視機命令對象  
  9.     /// </summary>  
  10.     public class TeleisionCommand : CommandInterface  
  11.     {  
  12.         /// <summary>  
  13.         /// 電視機對象  
  14.         /// </summary>  
  15.         private Television Tv = new Television();  
  16.         #region CommandInterface 成員  
  17.         /// <summary>  
  18.         /// 執(zhí)行命令  
  19.         /// </summary>  
  20.         public string Execute()  
  21.         {  
  22.             return Tv.Switch();  
  23.         }  
  24.  
  25.         #endregion  
  26.     }  
  27. }  

命令接口代碼:

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Text;  
  4.  
  5. namespace ConsoleApplication1  
  6. {  
  7.     /// <summary>  
  8.     /// 命令接口  
  9.     /// </summary>  
  10.     public interface CommandInterface  
  11.     {  
  12.         /// <summary>  
  13.         /// 執(zhí)行命令  
  14.         /// </summary>  
  15.         string Execute();  
  16.     }  
  17. }  

控制中心代碼:

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Text;  
  4.  
  5. namespace ConsoleApplication1  
  6. {  
  7.     /// <summary>  
  8.     /// 控制中心  
  9.     /// </summary>  
  10.     public static class ControlContent  
  11.     {  
  12.         private static CommandInterface Command;  
  13.         public static void SetControlObjectCommand(CommandInterface cobject)  
  14.         {  
  15.             Command = cobject;  
  16.         }  
  17.         public static string ExecuteControlObject()  
  18.         {  
  19.             return Command.Execute();  
  20.         }  
  21.     }  
  22. }  

模擬代碼:

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Text;  
  4.  
  5. namespace ConsoleApplication1  
  6. {  
  7.     class Program  
  8.     {  
  9.         static void Main(string[] args)  
  10.         {  
  11.             TeleisionCommand tvcommand = new TeleisionCommand();  
  12.  
  13.             ControlContent.SetControlObjectCommand(tvcommand);  
  14.             Console.WriteLine(ControlContent.ExecuteControlObject());  
  15.             Console.ReadLine();  
  16.         }  
  17.     }  
  18. }  

總結:命令模式就講完了,大概的理論就是在中間架設一個命令對象將調用者與被調用者分離開來,解決兩者之間的耦合。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI