Java学设计模式之命令模式

一、命令模式概念

1.1 什么是命令模式

命令模式是一种行为型设计模式,它允许将请求封装成一个对象,从而使得可以用不同的请求对客户端参数化,并且能够对请求排队或记录请求日志,以及支持可撤销的操作。

结构

命令模式通常包含以下几个要素:

  1. Command(命令): 定义了执行操作的接口,通常包含一个执行操作的方法(比如 execute())。

  2. ConcreteCommand(具体命令): 实现了命令接口的具体命令类,包含了对接收者的引用以及具体的执行操作。

  3. Invoker(调用者): 负责调用命令对象执行请求的对象。

  4. Receiver(接收者): 知道如何执行与请求相关的操作,任何类都可能作为一个接收者。

  5. Client(客户端): 创建具体的命令对象并设置其接收者,然后将命令对象传递给调用者。

二、命令模式代码

2.1 命令

public interface Command {
    void execute();
}

2.2 具体命令

public class TurnOnCommand implements Command {
    private TV tv;

    TurnOnCommand(TV tv) {
        this.tv = tv;
    }

    @Override
    public void execute() {
        tv.turnOn();
    }
}
public class TurnOffCommand implements Command{
    private TV tv;

    TurnOffCommand(TV tv) {
        this.tv = tv;
    }

    @Override
    public void execute() {
        tv.turnOff();
    }
}
public class VolumeUpCommand implements Command {
    private TV tv;

    VolumeUpCommand(TV tv) {
        this.tv = tv;
    }

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

2.3 接收者

public class TV {
    void turnOn() {
        System.out.println("电视已打开");
    }

    void turnOff() {
        System.out.println("电视已关闭");
    }

    void volumeUp() {
        System.out.println("音量增加");
    }
}

2.4 调用者

public class RemoteControl {
    private Command command;

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

    void pressButton() {
        command.execute();
    }
}

2.5 测试类

public class CommandPatternTest {
    public static void main(String[] args) {
        TV tv = new TV();
        RemoteControl remoteControl = new RemoteControl();

        TurnOnCommand turnOnCommand = new TurnOnCommand(tv);
        TurnOffCommand turnOffCommand = new TurnOffCommand(tv);
        VolumeUpCommand volumeUpCommand = new VolumeUpCommand(tv);

        remoteControl.setCommand(turnOnCommand);
        remoteControl.pressButton();

        remoteControl.setCommand(volumeUpCommand);
        remoteControl.pressButton();

        remoteControl.setCommand(turnOffCommand);
        remoteControl.pressButton();
        // 输出:
        // 电视已打开
        // 音量增加
        // 电视已关闭
    }
}

三、总结

命令模式的优点包括:

  • 解耦了调用者和接收者,调用者不需要知道接收者的具体实现细节。
  • 可以轻松地新增、删除或者更换命令,而不影响其他部分的代码。

缺点包括:

  • 可能会产生大量的具体命令类,特别是当有很多不同的操作需要支持时。
  • 对于简单的命令,可能会显得过于繁琐。
posted @ 2024-05-10 11:21  启航黑珍珠号  阅读(126)  评论(0)    收藏  举报