命令模式(Command Pattern)是一种行为设计模式,它将请求封装成对象,以便参数化对象、延迟执行、记录请求日志、支持可撤销操作等。此模式基于“行动请求者”与“行动执行者”之间解耦的设计思想,使得请求的发送者和接收者之间没有直接的联系,通过命令对象作为中介,这样两者可以独立变化,提高系统的灵活性和可扩展性。
下面是一个使用Java实现命令模式的完整示例。在这个例子中,我们将模拟一个智能家居场景,其中包括一个智能灯泡和一个遥控器。遥控器可以用来开关灯泡,而开关操作将通过命令模式来实现。
首先,定义一个命令接口 Command,声明执行操作的方法 execute()。
- interface Command {
- void execute();
- }
接着,创建两个具体命令类 LightOnCommand 和 LightOffCommand,它们实现了 Command 接口,并且分别对应着打开和关闭灯的操作。每个命令类都会持有一个 Light 对象的引用,以便操作灯。
- class LightOnCommand implements Command {
- private final Light light;
-
- public LightOnCommand(Light light) {
- this.light = light;
- }
-
- @Override
- public void execute() {
- light.turnOn();
- }
- }
-
- class LightOffCommand implements Command {
- private final Light light;
-
- public LightOffCommand(Light light) {
- this.light = light;
- }
-
- @Override
- public void execute() {
- light.turnOff();
- }
- }
Light 类作为接收者,它包含实际执行动作的方法 turnOn() 和 turnOff()。
- class Light {
- public void turnOn() {
- System.out.println("Light is on");
- }
-
- public void turnOff() {
- System.out.println("Light is off");
- }
- }
RemoteControl 类作为调用者,它持有一个 Command 类型的成员变量,并提供方法 setCommand() 来设置命令,以及 buttonPressed() 来执行当前设置的命令。
- class RemoteControl {
- private Command command;
-
- public void setCommand(Command command) {
- this.command = command;
- }
-
- public void buttonPressed() {
- command.execute();
- }
- }
最后,客户端代码创建 Light 对象、LightOnCommand 和 LightOffCommand 对象,以及 RemoteControl 对象,并通过遥控器控制灯的开关。
- public class CommandPatternDemo {
- public static void main(String[] args) {
- // 创建接收者对象
- Light light = new Light();
-
- // 创建命令对象
- Command lightOnCommand = new LightOnCommand(light);
- Command lightOffCommand = new LightOffCommand(light);
-
- // 创建调用者对象
- RemoteControl remoteControl = new RemoteControl();
-
- // 设置命令
- remoteControl.setCommand(lightOnCommand);
- System.out.println("Pressing ON button...");
- remoteControl.buttonPressed(); // 输出 "Light is on"
-
- remoteControl.setCommand(lightOffCommand);
- System.out.println("Pressing OFF button...");
- remoteControl.buttonPressed(); // 输出 "Light is off"
- }
- }
这个例子展示了如何使用命令模式来解耦请求的发起者(遥控器)和请求的处理者(灯),使得添加新的命令或者更改现有命令的执行逻辑变得简单且灵活。