命令模式(Command Pattern)一、定义

命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。

将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。

二、优缺点

优点: 1、降低了系统耦合度。 2、新的命令可以很容易添加到系统中去。

缺点: 1、使用命令模式可能会导致某些系统有过多的具体命令类。

三、具体实现3.1 原型图

  1. Command:声明执行操作的接口。
  2. ConcreteCommand:将一个接收者对象绑定于一个动作。调用接收者相应的操作,以实现Execute。
  3. Client:创建一个具体命令对象并设定它的接受者。
  4. Invoker:要求该命令执行这个请求。
  5. Receiver:知道如何实施与执行一个请求相关的操作。任何类都可能作为一个接受者。

3.2 实现

1、创建一个命令接口 Command。

/** * @author zhongtao * @date 2023/5/28 14:44 */public interface Order {    void execute();}

2、创建一个请求类 Client。

/** * @author zhongtao * @date 2023/5/28 14:44 */public class Stock {    private String name = "商品ABC";    private int quantity = 10;    public void buy() {        System.out.println("Stock [ Name: " + name + ", Quantity:" + quantity + " ]bought ");    }    public void sell() {        System.out.println("Stock [ Name: " + name + ", Quantity:" + quantity + " ]sold ");    }}

3、创建实现了Order接口的实体类 ConcreteCommand。

/** * @author zhongtao * @date 2023/5/28 14:45 */public class BuyStock implements Order {    private Stock abcStock;    public BuyStock(Stock abcStock) {        this.abcStock = abcStock;    }    @Override    public void execute() {        abcStock.buy();    }}/** * @author zhongtao * @date 2023/5/28 14:46 */public class SellStock implements Order {    private Stock abcStock;    public SellStock(Stock abcStock) {        this.abcStock = abcStock;    }    @Override    public void execute() {        abcStock.sell();    }}

4、创建命令调用类 Receiver。

import java.util.ArrayList;import java.util.List;/** * @author zhongtao * @date 2023/5/28 14:46 */public class Broker {    private List orderList = new ArrayList();    public void takeOrder(Order order) {        orderList.add(order);    }    public void placeOrders() {        for (Order order : orderList) {            order.execute();        }        orderList.clear();    }}

5、使用 Broker 类来接受并执行命令。

/** * @author zhongtao * @date 2023/5/28 14:47 */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();    }}

6、执行程序,输出结果:

Stock [ Name: 商品ABC, Quantity:10 ]bought Stock [ Name: 商品ABC, Quantity:10 ]sold