命令模式(十四)

Andy 2023年06月08日 544次浏览

以命令的形式包裹在对象中,并传给调用对象
意图:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。

菜鸟案例:
我们首先创建作为命令的接口 Order,然后创建作为请求的 Stock 类。实体命令类 BuyStock 和 SellStock,实现了 Order 接口,将执行实际的命令处理。创建作为调用对象的类 Broker,它接受订单并能下订单。

Broker 对象使用命令模式,基于命令的类型确定哪个对象执行哪个命令。CommandPatternDemo,我们的演示类使用 Broker 类来演示命令模式。
image.png
看上面的一开始很懵逼,怎么弄的,思路开放不出来,等看了下面的代码思路才起来,有些必要的地方我都加了注释

下面根据图拆分总结总结思路:
image.png
左下的大框里的解释一个接口和两个实现类
为什么还要加上右上角那个框呢?
看看那两个实现类(BuyStock,SellStock)里面都有两个成员属性,都是Stock类型的,看上面的介绍知道Stock是创建请求的类,而请求的实体类再实现命令接口的实体类里,它俩一组合不就成了请求命令类了吗?这时候是不是脑洞大开
那BuyStock,SellStock中的成员属性Stock可以在new 的时候通过构造函数给Stock赋对象,但是这个对象用在哪呢?
Order里有一个抽象方法execute,这个方法在实体类里就是Stock需要做的事
BuyStock,SellStock把Stock的那两个方法分开了,看名称就知道,你要问为什么?
介绍中有这么一句话:基于命令的类型确定哪个对象执行哪个命令,buy和sell都是一种类型,所以单独给它们创建了BuyStock,SellStock这俩对象
再看原图
image.png

现在是不是就有点思路了?
那开始有边两个框,进行串起来:main就是创建命令,创建请求的,这个没什么问题,主要是下面的Broker
先分析Broker里的成员变量个方法:一个List的Order,不用想了,肯定是存BuyStock,SellStock这两对象,别说是存Order的,如果你说是存Order的那你可以重新学java了
再来看那两个方法:takeOrder(添加订单),placeOrders(下订单),翻译的不是太准,请见谅。
添加订单就是添加一个命令,下订单可以认为是输出一个命令,那命令从哪来,从哪添加,肯定是List啊,所以这就是分别Stock的Sell类型的命令和Buy类型的命令添加和输出的

这样就差不多了,看下面的代码吧

看代码会有更清楚的思路
(1)建一个命令接口。
Order.java

public interface Order {
   void execute();
}

(2)创建一个请求类。
Stock.java

public class Stock {
   
   private String name = "ABC";
   private int quantity = 10;
 //这是Buy类型的命令
   public void buy(){
      System.out.println("Stock [ Name: "+name+", 
         Quantity: " + quantity +" ] bought");
   }
   //这是Sell类型的命令
   public void sell(){
      System.out.println("Stock [ Name: "+name+", 
         Quantity: " + quantity +" ] sold");
   }
}

(3)创建实现了 Order 接口的实体类。
BuyStock.java

public class BuyStock implements Order {
   private Stock abcStock;
 
   public BuyStock(Stock abcStock){
      this.abcStock = abcStock;
   }
 //这只是Stock的buy命令吧
   public void execute() {
      abcStock.buy();
   }
}

SellStock.java

public class SellStock implements Order {
   private Stock abcStock;
 
   public SellStock(Stock abcStock){
      this.abcStock = abcStock;
   }
 //这只是Stock的sell命令
   public void execute() {
      abcStock.sell();
   }
}

(4)创建命令调用类。
Broker.java

import java.util.ArrayList;
import java.util.List;
 
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自己的输出操作
         order.execute();
      }
      orderList.clear();
   }
}

(5)使用 Broker 类来接受并执行命令。
CommandPatternDemo.java

public class CommandPatternDemo {
   public static void main(String[] args) {
      Stock abcStock = new Stock();
 	//把一个Stock根据命令的类型分给下面两个命令对象
      BuyStock buyStockOrder = new BuyStock(abcStock);
      SellStock sellStockOrder = new SellStock(abcStock);
 	//命令的集中地
      Broker broker = new Broker();
      //添加命令
      broker.takeOrder(buyStockOrder);
      broker.takeOrder(sellStockOrder);
 	//输出命令
      broker.placeOrders();
   }
}

执行程序,输出结果:

Stock [ Name: ABC, Quantity: 10 ] bought
Stock [ Name: ABC, Quantity: 10 ] sold
————————————————
版权声明:本文为CSDN博主「胖墩的IT」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43113679/article/details/99475921