- 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 条
- 全部回答
-
花舞う葬で 普通会员 1楼
命令模式(Command Pattern)是一种行为设计模式,它描述了对象之间的行为。在命令模式中,对象不直接知道它们自己的行为,而是由调用者通过命令对象来控制。调用者通过将命令对象传递给自己的方法来执行命令。
在命令模式中,命令对象代表执行操作的对象。每个命令对象都有一个名字,用于标识它所执行的操作。每个命令对象都有一个执行命令的方法,该方法接收一个命令对象作为参数,并返回一个新的命令对象。这样,命令对象不再知道它们自己的行为,而是由调用者来控制。
命令模式在软件设计中非常常见,例如在数据库操作中,数据库的插入、更新和删除命令可以看作是不同的命令对象。在计算机图形学中,物体的移动、旋转和缩放命令也可以看作是不同的命令对象。在计算机编程中,文件的打开、关闭和读写操作也可以看作是不同的命令对象。
在使用命令模式时,我们通常会将命令对象封装在一个类中,这个类可以接收命令对象作为参数,并返回一个新的命令对象。这样,命令对象就不再知道它们自己的行为,而是由调用者来控制。这样,我们就可以在不改变命令对象本身的行为的情况下,修改或替换命令对象的行为。
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部
