设计模式的理解:命令模式 (Command)
生活随笔
收集整理的這篇文章主要介紹了
设计模式的理解:命令模式 (Command)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
命令模式(Command Pattern)是一種數據驅動的設計模式,它屬于行為型模式。請求以命令的形式包裹在對象中,并傳給調用對象。調用對象尋找可以處理該命令的合適的對象,并把該命令傳給相應的對象,該對象執行命令。
命令看成是函數方法,而這函數方法在不同的業務含義中,其參數個數,參數的數據類型,返回值可能不統一。把用戶可以觸發的功能當成一個命令,把這個“命令”封裝成一個對象。把對象拋給接收者,讓接收者處理其中的命令。而這個接收者可以接收命令的抽象類。這樣接收者就可以間接的統一處理 接口不統一的函數方法了。
以添加商品到購物車,刪除購物車中的商品,支付購物車的商品為例:
class ICommand{ public:virtual void execute() = 0; };class Commodity{ public:string id; };class ShoppingCart{ public:string cartid;List<Commodity> commodities; };//原先添加商品,需要傳兩個參數 (Commodity,ShoppingCart),現在用對象封裝在構造函數和execute中 class AddCommodityToCart :public ICommand{Commodity commodity ;ShoppingCart shoppingCart ; public:void AddCommodityToCart (Commodity c, ShoppingCart s):commodity(c),shoppingCart (s){}void execute() {shoppingCart.commodities.add(commodity );} };//原先刪除商品,需要傳兩個參數 (ShoppingCart,string ),現在用對象封裝在構造函數和execute中 class RemoveCommodity :public ICommand{string commodityId;ShoppingCart shoppingCart ; public:void RemoveCommodity (ShoppingCart s,string c):commodityId(c),shoppingCart (s){}void execute() {for(Commodity commodity : shoppingCart.commodities){if(commodity.id == commodityId){shoppingCart.commodities.remove(commodity );}}} }; //原先清空購物車,需要傳一個參數 (ShoppingCart),現在用對象封裝在構造函數和execute中 class PayCart :public ICommand{ShoppingCart shoppingCart ; public:void PayCart (ShoppingCart s): shoppingCart (s){}void execute() {cout<<"購物車支付:";for(Commodity commodity : shoppingCart.commodities){cout<<commodity.id <<"\t";}shoppingCart.commodities.clear();} };//執行命令的類 class Receiver { private :List <ICommand*> commands; public:void addCommands(ICommand* c){commands.add(c);};void action(ICommand* c=nullptr){if(c !==nullptr)commands.add(c);for (int i =0 ;i<commands.size();i++){commands[i]->execute();}} };而調用起來也是很方便的
Receiver USER_; ShoppingCart USERCART_;void executecommand(Icommand * c){USER.action(c);} void mainProcess(){Commodity commodity1("book");Commodity commodity1("game");AddCommodityToCart addCommodityToCart(commodity1,USERCART_);RemoveCommodityToCart removeCommodityToCart(USERCART_,"book");PayCart paycart(USERCART_);USER_.addCommand(&addCommodityToCart);USER_.addCommand(&removeCommodityToCart);executecommand(&paycart) ; //輸出 購物車支付game; }命令模式的實現,讓Receiver 對象成功處理 參數類型不同,參數個數不同,返回值不同的多個方法。當然在現如今已有更方便的實現方式可以滿足 “接收處理 格式不統一的函數” 。 例如 模板/泛型 ,重載括號運算符(函數對象)等方式實現。畢竟虛函數的運行時綁定(動態綁定)要比編譯時綁定的性能要低些。
總結
以上是生活随笔為你收集整理的设计模式的理解:命令模式 (Command)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设计模式的理解: 职责链模式 (Chai
- 下一篇: 设计模式的理解: 访问器模式 Visit