成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

設計模式學習總結:命令模式

開發 架構
在面向對象的軟件設計中,經常會遇到一個(或一系列)對象,對象本身的數據存儲與對象的操作耦合在一起。例如一個對象有add(),edit(),delete()方法,這樣對象支持的方法很難擴展,如果需要加入update()就必須修改代碼,客戶端與對象也是緊耦合的。

問題:

在面向對象的軟件設計中,經常會遇到一個(或一系列)對象,對象本身的數據存儲與對象的操作耦合在一起。例如一個對象有add(),edit(),delete()方法,這樣對象支持的方法很難擴展,如果需要加入update()就必須修改代碼,客戶端與對象也是緊耦合的。命令模式是將一類對象的功能(行為,功能)抽象成一個命令對象,客戶端在使用的時候,只與該命令對象打交道,而不用與對象打交道,分離命令的請求者和命令的執行者,降低了耦合性,可以使用不同的請求對客戶進行參數化提高了程序設計的靈活性。

定義:

命令模式(Command)模式,將一個請求封裝為一個對象,從而使你可用不同的請求對客戶進行參數化;對請求排隊或記錄請求日志,以及支持可撤消的操作。

意圖:

提供一個抽象的Command接口,將執行命令操作的方法封裝到Command類接口中,ConcreteCommand實現這個Command接口方法,通過調用Receiver實例變量處理請求。客戶端定義一個Invoker對象存儲該concreteCommand對象,該invoker通過調用command對象的遞交一個請求。

參與者:

•抽象命令角色(Command):  

定義命令的接口,聲明執行的方法。   

具體命令角色(ConcreteCommand):   

命令接口實現對象,是“虛”的實現;通常會持有接收者,并調用接收者的功能來完成命令要執行的操作。  

•請求者(Invoker):

要求命令對象執行請求,通常會持有命令對象,可以持有很多的命令對象。這個是客戶端真正觸發命令并要求命令執行相應操作的地方,也就是說相當于使用命令對象的入口。  

•接收者(Receiver、執行者):   

接收者,真正執行命令的對象。任何類都可能成為一個接收者,只要它能夠實現命令要求實現的相應功能。

•客戶端(Client):   

創建具體的命令對象,并且設置命令對象的接收者。注意這個不是我們常規意義上的客戶端,而是在組裝命令對象和接收者,或許,把這個Client稱為裝配者會更好理解,因為真正使用命令的客戶端是從Invoker來觸發執行。

UML圖:

實例說明:

諾基亞手機工廠

公司(Client)通知生產部(Invoker),生產兩部n8,兩部n9,生產部通過“命令模式”,將生產任務交給手機工廠(Receiver),生產手機。

uml圖如下:

 

 

  1. /// <summary>  
  2. /// 手機生產命令接口(Command)  
  3. /// </summary>  
  4. public interface ICreatePhoneCommand  
  5. {  
  6.     void Execute();  
  7. }  
  8. /// <summary>  
  9. /// N8手機生產具體命令類(ConcreteCommand)  
  10. /// </summary>  
  11. public class CreateNokiaN8Command : ICreatePhoneCommand  
  12. {  
  13.     PhoneFactory phoneFactory = null;  
  14.  
  15.     public CreateNokiaN8Command(PhoneFactory _phoneFactory)  
  16.     {  
  17.         phoneFactory = _phoneFactory;  
  18.     }  
  19.     public void Execute()  
  20.     {  
  21.             phoneFactory.CreateNokiaN8();  
  22.     }  
  23. }  
  24. /// <summary>  
  25. /// N8手機生產具體命令類(ConcreteCommand)  
  26. /// </summary>  
  27. public class CreateNokiaN9Command : ICreatePhoneCommand  
  28. {  
  29.     PhoneFactory phoneFactory = null;  
  30.     public CreateNokiaN9Command(PhoneFactory _phoneFactory)  
  31.     {  
  32.         phoneFactory = _phoneFactory;  
  33.     }  
  34.     public void Execute()  
  35.     {  
  36.         phoneFactory.CreateNokiaN9();  
  37.     }  
  38. }  
  39. /// <summary>  
  40. /// 手機生產工廠(Receiver)具體的手機生產  
  41. /// </summary>  
  42. public class PhoneFactory   
  43. {  
  44.     public void CreateNokiaN8()  
  45.     {  
  46.         System.Console.WriteLine("一部Nokia N8 生產完成");  
  47.     }  
  48.     public void CreateNokiaN9()  
  49.     {  
  50.         System.Console.WriteLine("一部Nokia N9 生產完成");  
  51.     }  
  52. }  
  53. /// <summary>  
  54. /// 生產部對象(Invoker)接收生產信息,制定生產清單。通知PhoneFactory生產  
  55. /// </summary>  
  56. public class LiaisonCreate  
  57. {  
  58.     List<ICreatePhoneCommand> createPhoneCommandList = new List<ICreatePhoneCommand>();  
  59.     /// <summary>  
  60.     /// 添加生產任務  
  61.     /// </summary>  
  62.     /// <param name="_createPhoneCommand"></param>  
  63.     public void AddCreatePhoneTask(ICreatePhoneCommand _createPhoneCommand)  
  64.     {  
  65.         createPhoneCommandList.Add(_createPhoneCommand);  
  66.     }  
  67.     /// <summary>  
  68.     /// 撤銷生產任務  
  69.     /// </summary>  
  70.     /// <param name="_createPhoneCommand"></param>  
  71.     public void CancelCreatePhoneTask(ICreatePhoneCommand _createPhoneCommand)  
  72.     {  
  73.         createPhoneCommandList.Remove(_createPhoneCommand);  
  74.     }  
  75.     /// <summary>  
  76.     /// 執行生產  
  77.     /// </summary>  
  78.     public void CreatePhone()  
  79.     {  
  80.         foreach (var createPhoneCommand in createPhoneCommandList)  
  81.         {  
  82.             createPhoneCommand.Execute();  
  83.         }  
  84.     }  
  85. }  
  86. public  void CommandTest()  
  87. {  
  88.     //初始化生產部聯系人  
  89.     LiaisonCreate liaisonCreate = new LiaisonCreate();  
  90.     //初始化生產工廠  
  91.     PhoneFactory phoneFactory = new PhoneFactory();  
  92.     //設置生產清單  
  93.     liaisonCreate.AddCreatePhoneTask(new CreateNokiaN8Command(phoneFactory));  
  94.     liaisonCreate.AddCreatePhoneTask(new CreateNokiaN8Command(phoneFactory));  
  95.     liaisonCreate.AddCreatePhoneTask(new CreateNokiaN9Command(phoneFactory));  
  96.     liaisonCreate.AddCreatePhoneTask(new CreateNokiaN9Command(phoneFactory));  
  97.     //取消一部N9的生產  
  98.     liaisonCreate.CancelCreatePhoneTask(new CreateNokiaN9Command(phoneFactory));  
  99.  
  100.     //開始執行生產  
  101.     liaisonCreate.CreatePhone();  
  102.     System.Console.Read();  

優點:

•命令模式將發出命令的責任和執行命令的責任分割開,降低系統的耦合度。 

•新的命令可以很容易地加入到系統中。只要實現了抽象命令接口的具體命令類就可以與接收者相關聯。  

•可以比較容易地設計一個組合命令,形成一個輕量級的事件隊列

•命令模式使請求本身成為一個對象,這個對象和其他對象一樣可以被存儲和傳遞。

•請求方不必知道接收請求的接口,執行命令的細節(只需客戶端為concreteCommand對象指定一個receiver對象即可)起到了很好的封裝隔離作用.

缺點:

•每一個命令都需要設計一個具體命令類,使用命令模式會導致某些系統有過多的具體命令類。
 

應用情景:

•系統需要將請求調用者和請求接收者解耦,使得調用者和接收者不直接交互。   

•系統需要在不同的時間指定請求、將請求排隊和執行請求。   

•系統需要支持命令的撤銷(Undo)操作和恢復(Redo)操作。   

•系統需要將一組操作組合在一起,即支持宏命令。

原文鏈接:http://www.cnblogs.com/ejiyuan/archive/2012/06/28/2567905.html

責任編輯:林師授 來源: 博客園
相關推薦

2020-11-03 13:05:18

命令模式

2023-05-04 08:47:31

命令模式抽象接口

2010-04-13 08:54:28

PHP設計模式命令模式

2009-07-09 17:30:59

Singleton模式C++ SingletJava Single

2009-06-15 14:19:55

Java設計模式Java

2013-05-27 12:59:22

設計模式GoF

2021-02-01 10:01:58

設計模式 Java單例模式

2024-04-18 00:22:10

設計模式接口代碼

2011-07-26 17:31:52

iOS 設計模式

2011-07-26 15:29:36

Cocoa 模式

2021-04-19 21:25:48

設計模式到元

2020-08-21 07:23:50

工廠模式設計

2020-11-04 08:54:54

狀態模式

2023-04-10 09:20:13

設計模式訪客模式

2013-11-26 16:09:34

Android設計模式

2020-10-23 09:40:26

設計模式

2022-01-12 13:33:25

工廠模式設計

2023-11-02 21:11:11

JavaScript設計模式

2009-10-19 09:49:37

Java命令模式

2021-07-20 08:52:20

命令模式中介者模式設計模式
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 男女羞羞视频大全 | 久久国产精品网站 | 在线观看亚洲专区 | 国产精品亚洲欧美日韩一区在线 | 中文字幕一区在线观看视频 | 99亚洲精品 | 亚洲一区二区三区桃乃木香奈 | 国产精品区一区二区三区 | 鸡毛片 | 国产91丝袜在线播放 | 国产精品无码专区在线观看 | 亚洲精品电影在线 | 日韩二三区 | 久久久久久综合 | 久久网日本 | 欧美一级艳情片免费观看 | 国产99久久精品一区二区300 | 黄色一级免费 | 在线观看视频91 | 亚洲精品中文在线 | 国产精品1区 | 国产精品一区二区三区在线 | 欧美色综合网 | 成人av免费在线观看 | 91免费在线| 天天艹逼网 | 久久久久久国产 | 91精品久久久久久久久中文字幕 | 日韩在线精品视频 | 2021天天干夜夜爽 | 亚洲电影免费 | 欧美精品二区三区 | 成人在线精品 | 高清成人av | 久久久久久久一级 | 日韩综合一区 | 国产精品久久久久久妇女6080 | 国产视频一区在线观看 | 自拍偷拍精品 | 人人鲁人人莫人人爱精品 | 中文在线视频观看 |