设计模式-命令模式-示例买卖股票

命令模式

命令模式:数据驱动的设计模式,行为型模式
核心理解:将请求封装成一个对象,传给调用者,调用者基于请求的类型确定哪个对象执行哪个命令。
主要解决:将行为请求者和行为实现者解耦
参考网址:https://www.runoob.com/design-pattern/command-pattern.html 讲的不好,不够清晰

一般来说,命令模式首先需要一个只有单一方法的接口,然后从该接口实现具有各自不同的行为的多个子类。接下来,我们就可以构造命令对象对象,并在需要的时候使用它们。

代码分析(先看示例代码):

  1. 首先创建命令的接口Order,然后创建作为请求的Stock类,实体命令类BuyStock和SellStock,实现Order接口,将执行实际命令的处理。
  2. 创建作为调用对象的类Broker,Broker对象使用命令模式,基于命令的类型确定哪个对象执行哪个命令
  3. UML类图如下
    命令模式

示例代码

//===============================步骤一、创建一个命令接口============================
interface Order {
    void execute();
}

//===============================步骤二、 创建一个请求类============================
class Stock {

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

    Stock (String name) {
        this.name = name;
    }

    public void buy(){
        System.out.println("Stock [ Name: "+name+ ", Quantity: " + quantity +" ] bought");
    }
    public void sell(){
        System.out.println("Stock [ Name: "+name+",  Quantity: " + quantity +" ] sold");
    }
}


//===============================步骤三、 创建实现Order接口的实体类,即实体命令类BuyStock和SellStock,执行实际的命令处理============================
class BuyStock implements Order {
    private Stock abcStock;

    public BuyStock(Stock abcStock){ // constructor  实体命令类初始化参数是请求类
        this.abcStock = abcStock;
    }

    public void execute() {
        abcStock.buy();
    }
}

class SellStock implements Order {
    private Stock abcStock;   // 请求类的引用

    public SellStock(Stock abcStock){ // constructor
        this.abcStock = abcStock;
    }

    public void execute() {
        abcStock.sell();
    }
}

//===============================步骤四、创建命令的调用类============================
class Broker {
    private List<Order> orderList = new ArrayList<Order>(); // 在orderList放入命令,然后挨个执行

    public void takeOrder(Order order){
        orderList.add(order);
    }

    public void placeOrders(){
        for (Order order : orderList) {
            order.execute();
        }
        orderList.clear();
    }
}

//===============================步骤五、使用Broker类来接受并执行命令============================
// Broker对象使用命令模式,基于命令的类型确定哪个对象执行哪个命令
public class CommandPatternDemo {
    public static void main(String[] args) {
        Stock abcStock = new Stock("abcStock");  // 创建一个请求类
        Stock ABCStock = new Stock("ABCStock");

        BuyStock buyStockOrder = new BuyStock(abcStock); // 1. 将请求封装成一个对象,在需要的时候使用它们
        SellStock sellStockOrder = new SellStock(ABCStock);

        Broker broker = new Broker(); // 调用命令对象


        broker.takeOrder(buyStockOrder);
        broker.takeOrder(sellStockOrder); // // 2. 调用者基于请求对象确定哪个Stock对象执行哪个Order命令
        broker.placeOrders();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值