【设计模式】(二十一)--行为型模式--命令模式
程序员文章站
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();
}
}
}
结果