标签:缺点 private oid vat iter 执行 ceo 之间 namespace
将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。
■ 类间解耦。调用者角色与接收者角色之间没有任何依赖关系,调用者实现功能时只需要调用Command中的execute()方法即可,不需要了解是哪个接收者执行。
■ 可扩展性。Command 的子类可以非常容易地扩展,而调用者Invoker和高层次的模块Client不产生严重的代码耦合。
■ 命令模式结合其他模式会更优秀。命令模式可以结合责任链模式,实现命令族解析任务,结合模板方法模式,则可以减少Command子类的膨胀问题。
■ 使用命令模式可能会导致系统中出现过多的具体命令类,因此需要在项目中慎重考虑使用。
■ 使用命令模式作为“回调”在面向对象系统中的替代。“回调”讲的便是将一个函数登记上,然后在以后调用此函数。
■ 需要在不同的时间指定请求、将请求排队。
■ 系统需要支持命令的撤销(undo)。命令对象可以把状态存储起来,等到客户端需要撤销时,可以调用undo()方法,将命令所产生的效果撤销。
■ 需要将系统中所有的数据更新操作保存到日志里,以便在系统崩溃时,可以根据日志读回所有的数据更新命令,重新调用 execute()方法一条一条执行这些命令,从而恢复系统在崩溃前所做的数据更新。
■ 一个系统需要支持交易(transaction)。一个交易结构封装了一组数据更新命令。使用命令模式来实现交易结构可以使系统增加新的交易类型
1 #include<iostream> 2 #include<list> 3 using namespace std; 4 class Order{ 5 public: 6 virtual void execute() = 0; 7 }; 8 class Stock{ 9 private: 10 string name = "ABC"; 11 int quantity = 10; 12 public: 13 void buy(){ 14 cout<<"Stock [ Name: "+name+" Quantity: " << quantity <<" ] bought"<<endl; 15 } 16 void sell(){ 17 cout<<"Stock [ Name: "+name+" Quantity: " << quantity <<" ] sold"<<endl; 18 } 19 }; 20 class BuyStock:public Order{ 21 private: 22 Stock abcStock; 23 public: 24 BuyStock(Stock abcStock){ 25 this->abcStock = abcStock; 26 } 27 void execute() { 28 abcStock.buy(); 29 } 30 }; 31 class SellStock:public Order { 32 private: 33 Stock abcStock; 34 35 public: 36 SellStock(Stock abcStock){ 37 this->abcStock = abcStock; 38 } 39 40 void execute() { 41 abcStock.sell(); 42 } 43 }; 44 45 class Broker { 46 private: 47 list<Order*> orderList; 48 public: 49 void takeOrder(Order* order){ 50 orderList.push_back(order); 51 } 52 53 void placeOrders(){ 54 list<Order*>::iterator iter = orderList.begin(); 55 for (; iter != orderList.end(); iter++){ 56 (*iter)->execute(); 57 delete (*iter); 58 } 59 orderList.clear(); 60 } 61 }; 62 63 int main(){ 64 Stock abcStock; 65 Order* buyStockOrder = new BuyStock(abcStock); 66 Order* sellStockOrder = new SellStock(abcStock); 67 Broker broker; 68 broker.takeOrder(buyStockOrder); 69 broker.takeOrder(sellStockOrder); 70 broker.placeOrders(); 71 delete buyStockOrder; 72 buyStockOrder = NULL; 73 delete sellStockOrder; 74 sellStockOrder = NULL; 75 }
标签:缺点 private oid vat iter 执行 ceo 之间 namespace
原文地址:https://www.cnblogs.com/46cxf/p/13944200.html