账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    关于【设计模式】之【命令模式】的疑问
    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的成本要比改动遥控器的成本要小的意思?望赐教感激不尽!

    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 10 元积分
        全部回答
    • 共 0 条
    • 花舞う葬で 普通会员 1楼

      命令模式(Command Pattern)是一种行为设计模式,它描述了对象之间的行为。在命令模式中,对象不直接知道它们自己的行为,而是由调用者通过命令对象来控制。调用者通过将命令对象传递给自己的方法来执行命令。

      在命令模式中,命令对象代表执行操作的对象。每个命令对象都有一个名字,用于标识它所执行的操作。每个命令对象都有一个执行命令的方法,该方法接收一个命令对象作为参数,并返回一个新的命令对象。这样,命令对象不再知道它们自己的行为,而是由调用者来控制。

      命令模式在软件设计中非常常见,例如在数据库操作中,数据库的插入、更新和删除命令可以看作是不同的命令对象。在计算机图形学中,物体的移动、旋转和缩放命令也可以看作是不同的命令对象。在计算机编程中,文件的打开、关闭和读写操作也可以看作是不同的命令对象。

      在使用命令模式时,我们通常会将命令对象封装在一个类中,这个类可以接收命令对象作为参数,并返回一个新的命令对象。这样,命令对象就不再知道它们自己的行为,而是由调用者来控制。这样,我们就可以在不改变命令对象本身的行为的情况下,修改或替换命令对象的行为。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部