目录
1.核心思想
将请求或操作封装成一个对象,从而使得可以参数化 clients 希望执行的操作。
2.成员
命令(Command):
命令对象封装了请求的信息,通常包括调用操作的对象(接收者)、方法名、参数等。
接口或抽象类定义了执行操作的方法 execute()
。
具体命令(Concrete Command):
实现了命令接口,负责调用接收者并执行请求。
将一个接收者对象绑定于一个动作,调用接收者相应的操作,以实现 execute()
方法。
调用者(Invoker):
负责调用命令对象来执行请求。
不直接执行请求的操作,而是通过命令对象来间接调用。
接收者(Receiver):
知道如何实施与执行一个请求相关的操作。
任何类都可能作为一个接收者。
客户端(Client):
创建具体命令对象并设置其接收者。
将命令对象传递给调用者以执行请求。
3.优点
解耦:
命令模式将调用操作的对象(调用者)与知道如何实现操作的对象(接收者)解耦。调用者只需知道如何调用命令对象即可,无需了解命令的具体实现细节。
这种解耦允许我们更容易地对系统进行修改和扩展,例如可以添加新的命令而无需修改已有的调用者代码。
增强灵活性:
命令模式使得可以将命令对象参数化,也就是说可以用不同的命令对象来进行请求。这样可以很容易地实现将命令排队、记录请求日志、撤销操作等功能。
由于命令对象本身就是一个对象,因此可以存储在数据结构中、作为参数传递给方法,甚至可以动态创建和销毁命令对象。
支持撤销和恢复操作:
命令对象通常会存储执行操作所需的状态,这使得实现撤销操作变得相对容易。通过实现一个 undo()
方法,可以回退到之前的状态或操作。
简化代码:
命令模式可以将复杂的操作封装到一个简单的接口中。这样,调用者不需要知道复杂的实现细节,从而简化了调用者的代码逻辑。
更容易设计复杂的系统架构:
命令模式可以作为构建更大型的系统架构的基础。通过将系统操作封装成命令对象,可以更容易地设计和实现复杂的系统功能和功能组合。
4.代码实现
4.1 命令接口
//命令接口
public interface Command {
void execute();
}
4.2 接收者
//接收者
public class Light {
public void turnOn() {
System.out.println("灯打开了");
}
public void turnOff() {
System.out.println("灯关闭了");
}
}
4.3 具体命令
//具体命运类 开灯
public class TurnOnCommand implements Command{
private Light light;
public TurnOnCommand(Light light) {
this.light = light;
}
@Override
public void execute() {
light.turnOn();
}
}
//具体命运类 关灯
public class TurnOffCommand implements Command{
private Light light;
public TurnOffCommand(Light light) {
this.light = light;
}
@Override
public void execute() {
light.turnOff();
}
}
4.4 调用者
//调用者 开关
public class Switch {
private TurnOnCommand turnOnCommand;
private TurnOffCommand turnOffCommand;
public Switch(TurnOnCommand turnOnCommand,TurnOffCommand turnOffCommand) {
this.turnOffCommand = turnOffCommand;
this.turnOnCommand = turnOnCommand;
}
public void turnOn() {
turnOnCommand.execute();
}
public void turnOff() {
turnOffCommand.execute();
}
}
4.5 客户端
public class Test {
public static void main(String[] args) {
//创建接收者对象
Light light = new Light();
//创建命令对象,设定它的接收者
TurnOnCommand turnOnCommand = new TurnOnCommand(light);
TurnOffCommand turnOffCommand = new TurnOffCommand(light);
// 创建调用者并指定命令
Switch switcher = new Switch(turnOnCommand,turnOffCommand);
// 执行开灯命令
switcher.turnOn();
// 执行关灯命令
switcher.turnOff();
}
}