行为模式2.命令模式------灯的开关

发布于:2025-02-11 ⋅ 阅读:(91) ⋅ 点赞:(0)

行为型模式

  1. 模板方法模式(Template Method Pattern)
  2. 命令模式(Command Pattern)
  3. 迭代器模式(Iterator Pattern)
  4. 观察者模式(Observer Pattern)
  5. 中介者模式(Mediator Pattern)
  6. 备忘录模式(Memento Pattern)
  7. 解释器模式(Interpreter Pattern)
  8. 状态模式(State Pattern)
  9. 策略模式(Strategy Pattern)
  10. 职责链模式(Chain of Responsibility Pattern)
  11. 访问者模式(Visitor Pattern)

命令模式(Command Pattern) 是一种行为型设计模式,它将一个请求封装为一个对象,从而使你可以用不同的请求、队列或日志来参数化其他对象。命令模式让你能够将请求发送者与请求接收者解耦,发送者只关心发送命令,而不需要知道如何处理它们。命令模式非常适合用于需要将多个操作组合成一个单一操作、撤销操作等场景。

主要角色
  1. Command(命令接口):声明了执行操作的接口。
  2. ConcreteCommand(具体命令):实现了命令接口,并定义了与接收者的绑定关系。具体命令对象将请求传递给接收者。
  3. Receiver(接收者):知道如何实施与请求相关的操作。具体的操作由接收者完成。
  4. Invoker(调用者):负责调用命令对象执行请求。
  5. Client(客户端):创建命令对象并设置其接收者。
  6. 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
    }
}


网站公告

今日签到

点亮在社区的每一天
去签到