![[命令设计模式详解]C/Java/JS/Go/Python/TS不同语言实现 [命令设计模式详解]C/Java/JS/Go/Python/TS不同语言实现](/static/background/43.jpg)
简介
如果你需要通过操作来参数化对象,可使用命令模式。如果你想要将操作放入队列中、操作的执行或者远程执行操作,可使用命令模式。如果你想要实现操作回滚功能,可使用命令模式。
作用
- 将不同命令按照抽象命令封装成不同的对象,将这些命令放到调用者里。
- 客户通过调用者执行命令再去调用接受者的动作,顺序为:客户调用方->调用者->命令对象->接受者。
- 同其他对象一样,命令也可以实现序列化,从而方便地写入文件或数据库中,实现延迟执行。
实现步骤
- 创建一个抽象命令接口,实现基本的命令方法。
- 创建多个具体命令类,实现抽象命令接口,以来命令接收者。
- 创建命令接收者,也就是具体业务类,接受命令并执行动作。
- 创建命令调用者,这是一个聚合命令的类,添加命令和执行命令。
UML
Java代码
基础命令接口
// Command.java 命令抽象接口
public interface Command {
void execute(;
}
具体命令类,可以多个命令
// BuyCommand.java 购买命令,操作receiver,实现了抽象命令类 public class BuyCommand implements Command { private StockReceiver stockReceiver; public BuyCommand(StockReceiver stockReceiver { this.stockReceiver = stockReceiver; } // 命令类调用执行者的实际动作 public void execute( { System.out.println(this.getClass(.getName( + "::execute( "; this.stockReceiver.buy(; } } // SellCommand.java 出售命令,操作receiver,实现了抽象命令类 public class SellCommand implements Command { private StockReceiver stockReceiver; public SellCommand(StockReceiver stockReceiver { this.stockReceiver = stockReceiver; } // 命令类调用执行者的实际动作 public void execute( { System.out.println(this.getClass(.getName( + "::execute( "; stockReceiver.sell(; } }
命令调用类
// CommandInvoker.java 命令调用类,通过关联命令来执行命令的调用 public class CommandInvoker { private List<Command> commandList = new ArrayList<Command>(; // 储存命令 public void takeOrder(Command command { System.out.println(this.getClass(.getName( + "::takeOrder( " + command.getClass(.getName(; commandList.add(command; } // 统一执行 public void executeOrders( { System.out.println(this.getClass(.getName( + "::executeOrders( "; for (Command command : commandList { command.execute(; } commandList.clear(; } }
命令接收执行类
// StockReceiver.java 命令模式真正的执行类,不直接对外,通过command来调用
public class StockReceiver {
private String name;
private int num;
public StockReceiver(String name, int num {
this.name = name;
this.num = num;
}
public void buy( {
System.out.println(this.getClass(.getName( + "::buy( [name=" + this.name + " num=" + this.num + "]";
}
public void sell( {
System.out.println(this.getClass(.getName( + "::sell( [name=" + this.name + " num=" + this.num + "]";
}
public