二十三种设计模式第十九篇--命令模式

命令模式是一种行为设计模式,它将请求封装成一个独立的对象,从而允许您以参数化的方式将客户端代码与具体实现解耦。在命令模式中,命令对象充当调用者和接收者之间的中介。这使您能够根据需要将请求排队、记录请求日志、撤销操作等。

命令模式的核心组成部分包括:

命令接口(Command Interface):定义了执行操作的方法。 具体命令(Concrete
Command):实现了命令接口,并将具体的请求与实际的接收者相关联。
调用者(Invoker):接收客户端的请求,并将其转发给具体命令对象。 接收者(Receiver):实际执行操作的对象。

命令模式的优点包括:

  1. 解耦调用者和接收者:调用者无需知道具体执行操作的细节,只需通过命令对象调用相应的方法。
  2. 容易扩展和维护:可以方便地添加新的命令和接收者,因为每个命令都是独立的对象。
  3. 支持撤销和重做操作:由于所有命令都被封装成对象,可以轻松地实现撤销和重做功能。

然而,命令模式也有一些限制和适用场景:

  • 增加了类的数量:每个命令都需要一个具体的命令类,这可能导致系统中类的数量增加。
  • 不适合复杂的命令操作:如果命令需要多个步骤或复杂的逻辑,可能需要使用其他模式来更好地处理。

二十三种设计模式第十九篇--命令模式_第1张图片

public interface Order {
   void execute();
}
public class SellStock implements Order {
   private Stock abcStock;
 
   public SellStock(Stock abcStock){
      this.abcStock = abcStock;
   }
 
   @Override
   public void execute() {
      abcStock.sell();
   }
}
public class Stock {

   private String name = "ABC";
   private int quantity = 10;

   public void buy(){
      System.out.println("股票 [ 公司名: "+name+",数量: " + quantity +" ] 买");
   }

   public void sell(){
      System.out.println("股票 [ 公司名: "+name+",数量: " + quantity +" ] 卖");
   }
}

public class BuyStock implements Order {
   private Stock abcStock;
 
   public BuyStock(Stock abcStock){
      this.abcStock = abcStock;
   }
 
   @Override
   public void execute() {
      abcStock.buy();
   }
}
public class Broker {
   //组装命令
   private List<Order> orderList = new ArrayList<Order>(); 

   //接收命令,存到命令列表中
   public void takeOrder(Order order){
      orderList.add(order);      
   }

   //循环命令列表,逐个执行.
   public void placeOrders(){
      for (Order order : orderList) {
         order.execute();
      }
      orderList.clear();
   }
}
public class CommandPatternDemo {
   public static void main(String[] args) {
      Stock abcStock = new Stock();  //创建股票对象

      //创建命令
      BuyStock buyStockOrder = new BuyStock(abcStock);
      SellStock sellStockOrder = new SellStock(abcStock);

      //按顺序发布股票 买卖 指令
      Broker broker = new Broker();

      broker.takeOrder(buyStockOrder);
      broker.takeOrder(sellStockOrder);

      //统一执行所有的命令
      broker.placeOrders();
   }
}

注意:看得懂代码和写代码是两个概念,写得出高质量代码和写的出代码又是两个概念!!!这话是说给自己本人的,学习当永无止境,从事IT行业者更是如此,经验的积累并非一朝一夕就可以完成的,而是需要不断的尝试,从众多选择中获取最优的选择,这个方才是我从事这份行业中最宝贵的收货,初级-中级-高级是需要一段时间过度的,路在脚下,一个坑一个坑的踩着走,不知道有无踩的终点,但是在一路上将坑一个一个的填平,即便是没有填平的坑下次遇到就小心一点就是了,这方才是我们在这个行业最大的收货。

你可能感兴趣的:(#,设计模式,设计模式,命令模式)