以命令的形式包裹在对象中,并传给调用对象
意图:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。
菜鸟案例:
我们首先创建作为命令的接口 Order,然后创建作为请求的 Stock 类。实体命令类 BuyStock 和 SellStock,实现了 Order 接口,将执行实际的命令处理。创建作为调用对象的类 Broker,它接受订单并能下订单。
Broker 对象使用命令模式,基于命令的类型确定哪个对象执行哪个命令。CommandPatternDemo,我们的演示类使用 Broker 类来演示命令模式。
看上面的一开始很懵逼,怎么弄的,思路开放不出来,等看了下面的代码思路才起来,有些必要的地方我都加了注释
下面根据图拆分总结总结思路:
左下的大框里的解释一个接口和两个实现类
为什么还要加上右上角那个框呢?
看看那两个实现类(BuyStock,SellStock)里面都有两个成员属性,都是Stock类型的,看上面的介绍知道Stock是创建请求的类,而请求的实体类再实现命令接口的实体类里,它俩一组合不就成了请求命令类了吗?这时候是不是脑洞大开
那BuyStock,SellStock中的成员属性Stock可以在new 的时候通过构造函数给Stock赋对象,但是这个对象用在哪呢?
Order里有一个抽象方法execute,这个方法在实体类里就是Stock需要做的事
BuyStock,SellStock把Stock的那两个方法分开了,看名称就知道,你要问为什么?
介绍中有这么一句话:基于命令的类型确定哪个对象执行哪个命令,buy和sell都是一种类型,所以单独给它们创建了BuyStock,SellStock这俩对象
再看原图
现在是不是就有点思路了?
那开始有边两个框,进行串起来: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