关于【设计模式】之【命令模式】的疑问

发布于 2022-09-11 22:46:04 字数 2816 浏览 59 评论 0

现有电灯(Light)及其打开、关闭方法

public class Light { // 电灯实体
    public void on() { // 打开电灯
        System.out.println("Light::on");   
    }
    public void off() { // 关闭电灯
        System.out.println("Light:off");
    }
}

又有电脑(Computer)及其打开、关闭方法

public class Computer { // 电脑实体
    public void on() { // 打开电脑
        System.out.println("Computer::on");
    }
    public void off() { // 关闭电脑
        System.out.println("Computer::off");
    }
}

使用遥控器(ControlPanel)将电灯(Light)打开

public class ControlPanel {
    public static void main(String[] args) {
        Light light = new Light(); // 创建电灯实体并调用其on方法
        light.on();
    }
}

上述硬编码使遥控器(ControlPanel)与电灯(Light)耦合,现改为使用命令模式改写上述代码:

public interface Command { // 抽象命令类
    public void execute();
}
public class LightOnCommand implements Command { // 抽象命令类的实现类
    private Light light;
    public LightOnCommand(Light light) {
        this.light = light;
    }
    @Override
    public void execute() {
        light.on();
    }
}
public class ControlPanel { // 使用命令模式改写后的遥控器
    private Command command;
    public void setCommand(Command command) {
        this.command = command;
    } 
    public void execute() {
        this.command.execute();
    }
}

此时使用遥控器(ControlPanel)将电灯(Light)打开:

public class Client {
    public static void main(String[] args) {
        Light light = new Light();
        LightOnCommand lightOnCommand = new LightOnCommand(light);
        ControlPanel controlPanel = new ControlPanel();
        controlPanel.setCommand(lightOnCommand);
        controlPanel.execute();
    }
}

使用命令模式后遥控器(ControlPanel)与电灯(Light)解耦,此时如果需要修改遥控器的功能,如不再使用遥控器控制电灯,改为使用遥控器控制电脑(Computer),遥控器类无需修改,仅需添加命令类ComputerOnCommand并将Client修改为如下调用方式即可

public class ComputerOnCommand implements Command { // 新增命令类
    private Computer computer;
    public ComputerOnCommand(Computer computer) {
        this.computer = computer;
    }
    @Override
    public void execute() {
        computer.on();
    }
}
public class Client { // 修改后的客户端
    public static void main(String[] args) {
        Computer computer = new Computer();
        ComputerOnCommand computerOnCommand = new ComputerOnCommand(computer);
        ControlPanel controlPanel = new ControlPanel();
        controlPanel.setCommand(computerOnCommand);
        controlPanel.execute();
    }
}

使用命令模式后,若此时需要修改遥控器的功能,仅需实现新的命令类(如ComputerOnCommand)并将其注入遥控器,遥控器自身的代码无需修改

我的疑问是:

使用命令模式后遥控器类的代码是不用修改了,但是Client类每次也要修改啊!!!!!改哪不是改!!!!!
请教前辈们是否是我的理解有偏差,或是说实际使用时均是通过配置文件或Spring来实现Client中的关系注入,所以改动Client的成本要比改动遥控器的成本要小的意思?望赐教感激不尽!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

生生漫 2022-09-18 22:46:04

你可以参考一下这个文章,https://www.cnblogs.com/lizha...

可能更好理解一些。
我理解的命令模式包含以下特点:

  • 发出命令的对象与执行对象解耦;
  • 发出单个命令的发出与执行可以是异步的,命令发出不一样马上得到执行;
  • 可以对命令队列进行更多操作,如去重;
  • 可以对命令队列的执行进行统计,记录日志等等。

命令模式是将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。当将客户的单个请求封装成对象以后,我们就可以对这个请求存储更多的信息,使请求拥有更多的能力;命令模式同样能够把请求发送者和接收者解耦,使得命令发送者不用去关心请求将以何种方式被处理。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文