核心思想

封装请求:
将请求的每一个部分封装到一个独立的命令对象中;

解耦调用者接收者
调用者只需要知道如何调用命令对象,而不需要了解如何处理请求;

可扩展性:
可以很容易地增加新的命令。

优点

解耦:将请求的发送者和接收者解耦。
扩展性:可以很容易地增加新的命令。
支持撤销和恢复操作:如果实现了相应的逻辑,命令可以被撤销或重做。

缺点

类的数量增加:每个命令都需要一个具体的类,这可能导致类的数量增加。

Example

假设你在设计一个遥控器,它可以控制电视开关、音量等操作:

  • 命令接口:Command
  • 具体命令:TurnOnCommand, TurnOffCommand
  • 调用者:RemoteControl
  • 接收者:Television

下面是一个使用命令模式设计遥控器的Java示例。

接口和类定义

1. 命令接口

public interface Command {
    void execute();
    void undo();
}

2. 具体命令类

public class TurnOnCommand implements Command {
    private Television tv;

    public TurnOnCommand(Television tv) {
        this.tv = tv;
    }

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

    @Override
    public void undo() {
        tv.turnOff();
    }
}

public class TurnOffCommand implements Command {
    private Television tv;

    public TurnOffCommand(Television tv) {
        this.tv = tv;
    }

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

    @Override
    public void undo() {
        tv.turnOn();
    }
}

3. 接收者类

public class Television {
    public void turnOn() {
        System.out.println("Television is ON");
    }

    public void turnOff() {
        System.out.println("Television is OFF");
    }
}

4. 调用者类

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 Main {
    public static void main(String[] args) {
        Television tv = new Television();
        Command turnOn = new TurnOnCommand(tv);
        Command turnOff = new TurnOffCommand(tv);

        RemoteControl remote = new RemoteControl();

        remote.setCommand(turnOn);
        remote.pressButton();  // 输出: Television is ON
        remote.pressUndo();    // 输出: Television is OFF

        remote.setCommand(turnOff);
        remote.pressButton();  // 输出: Television is OFF
        remote.pressUndo();    // 输出: Television is ON
    }
}

说明

  • Command接口:定义了executeundo方法。
  • 具体命令类TurnOnCommandTurnOffCommand实现了Command接口。
  • 接收者类Television,包含turnOnturnOff方法。
  • 调用者类RemoteControl,允许设置命令并执行或撤销。

这样就实现了一个简单的遥控器案例,能够打开和关闭电视,并支持撤销操作。

posted on 2024-07-16 23:14  Mysticbinary  阅读(34)  评论(0编辑  收藏  举报