命令模式

命令模式

命令模式(Command Pattern)是行为型设计模式之一,它将请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,以及对请求排队或记录请求日志等操作。通过使用命令模式,命令的发出者与命令的执行者可以完全解耦。

命令模式的结构

  1. Command(命令接口/抽象类):定义了执行命令的方法,例如 execute()
  2. ConcreteCommand(具体命令类):实现了 Command 接口,具体实现了命令的执行逻辑。通常会持有对接收者对象的引用,并在 execute() 方法中调用接收者的相关操作。
  3. Receiver(接收者类):执行与请求相关的操作。每个具体命令将接收者对象的动作封装为命令。
  4. Invoker(调用者类):持有命令对象,并在某个时间点触发命令的执行。调用者通常不直接与接收者交互,而是通过命令对象来完成具体的操作。
  5. Client(客户端):创建命令对象并设定其接收者。客户端可以通过调用者来触发命令的执行。

示例

举个简单的例子,假设有一个遥控器可以控制灯的开关:

// Command接口
public interface Command {
    void execute();
}

// Receiver 接收者类
public class Light {
    public void turnOn() {
        System.out.println("Light is ON");
    }
    
    public void turnOff() {
        System.out.println("Light is OFF");
    }
}

// 具体命令类 - 打开灯
public class LightOnCommand implements Command {
    private Light light;

    public LightOnCommand(Light light) {
        this.light = light;
    }

    @Override
    public void execute() {
        light.turnOn();
    }
}

// 具体命令类 - 关闭灯
public class LightOffCommand implements Command {
    private Light light;

    public LightOffCommand(Light light) {
        this.light = light;
    }

    @Override
    public void execute() {
        light.turnOff();
    }
}

// Invoker 调用者类
public class RemoteControl {
    private Command command;

    public void setCommand(Command command) {
        this.command = command;
    }

    public void pressButton() {
        if (command != null) {
            command.execute();
        }
    }
}
// Client 客户端代码
public class Client {
    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();
        
        // 关闭灯
        remote.setCommand(lightOff);
        remote.pressButton();
    }
}


代码说明

  1. 命令接口 (Command):定义了一个execute()方法,所有命令都要实现这个接口。
  2. 接收者 (Light):包含实际执行操作的方法,比如turnOn()turnOff()
  3. 具体命令类 (LightOnCommand, LightOffCommand):每个具体命令类实现Command接口,并持有对接收者对象的引用。在execute()方法中调用接收者的具体操作。
  4. 调用者 (RemoteControl):调用者不直接与接收者交互,而是通过命令对象来间接操作。它持有命令对象,并在适当的时候调用execute()方法。
  5. 客户端 (Client):负责创建接收者、具体命令对象,并将命令对象传递给调用者。

命令模式的扩展

1. 撤销操作

要实现撤销操作,可以在命令类中增加undo()方法,并记录上一次执行的状态。例如:

java复制代码public interface Command {
    void execute();
    void undo();  // 撤销操作
}

在具体命令类中实现undo()方法:

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();
    }
}

2. 宏命令

宏命令是一组命令的组合,可以一次性执行多个命令。可以创建一个MacroCommand类来存储并执行多个命令:

import java.util.ArrayList;
import java.util.List;

public class MacroCommand implements Command {
    private List<Command> commands = new ArrayList<>();

    public void addCommand(Command command) {
        commands.add(command);
    }

    @Override
    public void execute() {
        for (Command command : commands) {
            command.execute();
        }
    }

    @Override
    public void undo() {
        for (Command command : commands) {
            command.undo();
        }
    }
}
posted @ 2024-09-17 15:12  疾风不问归途  阅读(92)  评论(0)    收藏  举报