欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【设计模式】(二十一)--行为型模式--命令模式

程序员文章站 2024-03-24 19:33:46
...

【设计模式】(二十一)–行为型模式–命令模式

命令模式定义

Encapsulate a request as an object , thereby letting you parameterize clients with different requests, queue or log requests, and support undoable operations.

意思是:将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化。对请求排队或者记录请求日志,可以提供命令的撤销和回复功能。
命令模式也称为行动模式、交易模式。它是一种数据驱动的设计模式,请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。
命令模式一般有五个元素

  • Command 命令类,命令的封装抽象类,声明了执行的抽象方法,
  • ConcreteCommand 具体命令类,命令类的实际实现,执行命令并处理与每个命令相关的参数
  • Receiver 接受者,负责执行与命令关联的操作的类
  • Invoker 调用者,触发命令的类,通常是外部事件

命令模式的优点

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

但是使用命令模式可能会导致某些系统有过多的具体命令类。

命令模式的使用场景

命令模式一般使用在认为是命令的地方都可以使用命令模式。比如:

  • 1、GUI 中每一个按钮都是一条命令。
  • 2、模拟 CMD。

命令模式的简单实现

类图
【设计模式】(二十一)--行为型模式--命令模式

实现

public class Test {
    public static void main(String[] args) {
        Stock stock = new Stock("贵州茅台", "600519", 1000, 1266);
        Command buyCommand = new BuyCommand(stock);
        Command sellCommand = new SellCommand(stock);
        Broker broker = new Broker();
        broker.receiveCommand(buyCommand);
        broker.receiveCommand(sellCommand);
        broker.executeCommand();
    }
}
public class Stock {
    private String name;
    private String code;
    private int count;
    private int price;

    public Stock(String name, String code, int count, int price) {
        this.name = name;
        this.code = code;
        this.count = count;
        this.price = price;
    }

    public void buy() {
        System.out.println("检测买入价格是否有卖盘");
        System.out.println("价格核准正确,买入成功");
    }

    public void sell() {
        System.out.println("检测卖出价格是否有买盘");
        System.out.println("价格核准正确,卖出成功");
    }

}
public interface Command {
    void execute();
}
public class BuyCommand implements Command {

    private Stock stock;

    public BuyCommand(Stock stock) {
        this.stock = stock;
    }

    @Override
    public void execute() {
        stock.buy();
    }
}
public class SellCommand implements Command {

    private Stock stock;

    public SellCommand(Stock stock) {
        this.stock = stock;
    }

    @Override
    public void execute() {
        stock.sell();
    }
}
public class Broker {
    private List<Command> commandList = new ArrayList<>();

    public void receiveCommand(Command command) {
        commandList.add(command);
    }

    public void executeCommand() {
        for (Command command : commandList) {
            command.execute();
        }
    }
}

结果
【设计模式】(二十一)--行为型模式--命令模式