行为型模式
- 模板方法模式(Template Method Pattern)
- 命令模式(Command Pattern)
- 迭代器模式(Iterator Pattern)
- 观察者模式(Observer Pattern)
- 中介者模式(Mediator Pattern)
- 备忘录模式(Memento Pattern)
- 解释器模式(Interpreter Pattern)
- 状态模式(State Pattern)
- 策略模式(Strategy Pattern)
- 职责链模式(Chain of Responsibility Pattern)
- 访问者模式(Visitor Pattern)
命令模式(Command Pattern) 是一种行为型设计模式,它将一个请求封装为一个对象,从而使你可以用不同的请求、队列或日志来参数化其他对象。命令模式让你能够将请求发送者与请求接收者解耦,发送者只关心发送命令,而不需要知道如何处理它们。命令模式非常适合用于需要将多个操作组合成一个单一操作、撤销操作等场景。
主要角色
- Command(命令接口):声明了执行操作的接口。
- ConcreteCommand(具体命令):实现了命令接口,并定义了与接收者的绑定关系。具体命令对象将请求传递给接收者。
- Receiver(接收者):知道如何实施与请求相关的操作。具体的操作由接收者完成。
- Invoker(调用者):负责调用命令对象执行请求。
- Client(客户端):创建命令对象并设置其接收者。
- Invoker(调用者):请求命令的执行。
+-----------+ +-------------------+ +------------+
| Client |------->| Invoker |------->| Command |
+-----------+ +-------------------+ +------------+
| |
v v
+-------------+ +-------------------+
| Receiver | | ConcreteCommand |
+-------------+ +-------------------+
工作原理
- 命令:创建一个命令对象,将请求转发到接收者对象。
- 调用者:调用命令对象的
execute()
方法来触发命令的执行。 - 接收者:接收请求并执行相关操作。
命令模式的优点
- 解耦请求者与执行者:发送请求的对象(调用者)不需要知道请求是如何被执行的,只需要知道如何调用命令接口。
- 灵活性高:可以将多个请求组合成一个命令,命令也可以进行撤销、重做等操作。
- 扩展性好:增加新命令时,只需要扩展新的命令类,无需修改现有的代码,符合开闭原则。
Java 示例代码
假设我们有一个遥控器(Invoker),可以控制开关家里的灯(Receiver),而每个按钮的动作就是一个命令(Command)。
// Command接口:所有具体命令的共同接口
public interface Command {
void execute();
void undo();
}
// Receiver:接收命令并执行相关操作
public class Light {
public void turnOn() {
System.out.println("Light is ON");
}
public void turnOff() {
System.out.println("Light is OFF");
}
}
// ConcreteCommand:开灯命令
public class LightOnCommand implements Command {
private Light light; // 接收者
public LightOnCommand(Light light) {
this.light = light;
}
@Override
public void execute() {
light.turnOn(); // 执行接收者的动作
}
@Override
public void undo() {
light.turnOff(); // 撤销操作
}
}
// ConcreteCommand:关灯命令
public class LightOffCommand implements Command {
private Light light;
public LightOffCommand(Light light) {
this.light = light;
}
@Override
public void execute() {
light.turnOff(); // 执行接收者的动作
}
@Override
public void undo() {
light.turnOn(); // 撤销操作
}
}
// Invoker:遥控器,调用命令
public class RemoteControl {
private Command command;
// 设置命令
public void setCommand(Command command) {
this.command = command;
}
// 执行命令
public void pressButton() {
command.execute();
}
// 撤销命令
public void pressUndo() {
command.undo();
}
}
public class CommandPatternDemo {
public static void main(String[] args) {
// 创建接收者
Light light = new Light();
// 创建具体命令
Command lightOn = new LightOnCommand(light);
Command lightOff = new LightOffCommand(light);
// 创建遥控器(调用者)
RemoteControl remote = new RemoteControl();
// 使用遥控器控制开关灯
remote.setCommand(lightOn);
remote.pressButton(); // 输出:Light is ON
remote.setCommand(lightOff);
remote.pressButton(); // 输出:Light is OFF
// 撤销操作
remote.pressUndo(); // 输出:Light is ON
}
}