设计模式的理解:命令模式 (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 对象成功处理 参数类型不同,参数个数不同,返回值不同的多个方法。当然在现如今已有更方便的实现方式可以满足 “接收处理 格式不统一的函数” 。 例如 模板/泛型 ,重载括号运算符(函数对象)等方式实现。毕竟虚函数的运行时绑定(动态绑定)要比编译时绑定的性能要低些。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
命令模式是一种行为设计模式,它将请求和实现请求的操作对象解耦,以便请求的对象不需要知道实现请求的对象是谁,也不需要知道请求是如何被实现的。在命令模式,请求被封装为一个对象,这个对象包含了要被执行的操作及其参数,以及实现该操作的对象。这样,请求的对象只需要发送请求,而不必关心请求的实现细节。 命令模式包含以下几个角色: - Command命令):定义了一个命令接口,包含了执行命令的方法execute()。 - ConcreteCommand(具体命令):实现了Command接口,包含了具体的执行逻辑。 - Invoker(调用者):包含了一个命令对象,并在需要的时候调用命令对象的execute()方法。 - Receiver(接收者):真正执行命令对象。 下面是一个简单的 Java 示例代码: ```java // Command 接口 public interface Command { void execute(); } // 具体命令类 public class ConcreteCommand implements Command { private Receiver receiver; public ConcreteCommand(Receiver receiver) { this.receiver = receiver; } @Override public void execute() { receiver.action(); } } // 接收者类 public class Receiver { public void action() { System.out.println("接收者执行命令"); } } // 调用者类 public class Invoker { private Command command; public Invoker(Command command) { this.command = command; } public void setCommand(Command command) { this.command = command; } public void executeCommand() { command.execute(); } } // 测试类 public class Test { public static void main(String[] args) { Receiver receiver = new Receiver(); Command command = new ConcreteCommand(receiver); Invoker invoker = new Invoker(command); invoker.executeCommand(); } } ``` 在上面的示例代码Command 接口定义了一个 execute() 方法,具体命令类 ConcreteCommand 实现了该接口,并在 execute() 方法调用了接收者类 Receiver 的 action() 方法。调用者类 Invoker 包含了一个命令对象,并在需要的时候调用命令对象的 execute() 方法,从而实现了命令的调用。 总之,命令模式可以将请求发送者和请求接收者解耦,使得请求发送者不需要知道请求接收者的实现细节,同时也方便对请求进行撤销、恢复等操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值