关于【设计模式】之【命令模式】的疑问
现有电灯(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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
你可以参考一下这个文章,https://www.cnblogs.com/lizha...
可能更好理解一些。
我理解的命令模式包含以下特点:
命令模式是将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。当将客户的单个请求封装成对象以后,我们就可以对这个请求存储更多的信息,使请求拥有更多的能力;命令模式同样能够把请求发送者和接收者解耦,使得命令发送者不用去关心请求将以何种方式被处理。