1. 设计模式之命令模式:给其他模块下达命令
1.1. 介绍
命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。
命令模式将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。
常见场景,例如系统赠送积分业务,可以将积分操作封装成命令,可以赠送积分,也可以撤销赠送的积分。
1.2. 优缺点及建议
优点
- 解耦请求发送者和接收者。
- 支持扩展新命令(开闭原则)。
- 支持撤销/重做操作。
缺点
- 每个命令需单独实现类,可能增加代码量。
- 复杂系统可能需要多层命令结构。
使用建议
- 简单场景:直接实现基础命令模式。
- 复杂场景:结合备忘录模式(Memento)实现多层撤销。
注意事项
- 如果系统需要支持命令的撤销(Undo)和恢复(Redo)操作,命令模式是一个合适的选择。
1.3. 实现及相关代码
接口及数据对象
public interface Command {
void execute();
void undo();
}
public static class CommandA implements Command {
public void execute() {
System.out.println("命令A的功能逻辑");
}
public void undo() {
System.out.println("撤销命令A的功能逻辑");
}
}
public static class CommandB implements Command {
public void execute() {
System.out.println("命令B的功能逻辑");
}
public void undo() {
System.out.println("撤销命令B的功能逻辑");
}
}
public static class Invoker {
private Command command;
public Command getCommand() {
return command;
}
public void setCommand(Command command) {
this.command = command;
}
public void execute() {
System.out.println("一些别的逻辑A");
command.execute();
System.out.println("一些别的逻辑B");
}
public void undo() {
command.undo();
}
}
调用方法
public static void main(String[] args) {
Command commandA = new CommandA();
Command commandB = new CommandB();
Invoker invoker = new Invoker();
invoker.setCommand(commandA);
invoker.execute();
invoker.undo();
invoker.setCommand(commandB);
invoker.execute();
invoker.undo();
}