大家好,我是洪爵,你看天上的星星,是不是排列组合成四个大字:设计模式。
今天给大家讲的是命令模式,命令模式是一种行为性模式,行为性模式特别关注对象之间的通信。
那么命令模式是干啥的,有什么用捏?话不多说,gogogo!
命令模式其实随处可见,比如当你按下了空调遥控器,空调就会去做对应的指令;比如我们输入java -version命令,那么如果你成功安装了java,那么它就会对你的命令做出回应,输出相应的版本号到屏幕,linux系统里面输入ls,cd,cat等等都是命令模式。
所以既然命令模式这么常见,我们还不学习起来!自己实现一个java -version!
命令模式将请求以命令的形式(信号)放在对象中(按钮),并传给调用对象(电视遥控器),调用对象会去寻找能处理该命令的对象(电视),并把该命令传给该对象,让该对象执行对应的命令。
大家有没有思考过为什么信号(属性)已经放在了按钮(对象)中,不能直接传给电视,而需要经过电视遥控器吗?
因为过于耦合,行为请求者与行为实现者太过耦合会导致后续拓展的问题,如我现在想要对我的行为做记录、撤销或重做等,这种高耦合的系统设计就变得难以实现。
类图:
上一波代码,彻底搞懂命令模式。
public class Computer {
public void getResponse() {
System.out.println("电脑响应");
}
}
public abstract class Command {
protected String key;
void execute() {
}
}
public class ClickCommand extends Command {
Computer computer;
public ClickCommand(Computer computer) {
key = "click";
this.computer = computer;
}
@Override
public void execute() {
computer.getResponse();
}
}
public class SlidingRollerCommand extends Command {
Computer computer;
public SlidingRollerCommand(Computer computer) {
key = "sliding";
this.computer = computer;
}
@Override
public void execute() {
computer.getResponse();
}
}
public class Mouse {
// 存放对应的命令
Map<String, Command> commandMap = new ConcurrentHashMap<>();
// 存放日志信息
List<String> bizLog = new ArrayList<>();
public Mouse() {
}
private void logs(String key, String msg) {
System.out.println(key + msg);
bizLog.add(key + msg);
}
public void showLogs() {
for(String log : bizLog) {
System.out.println(log);
}
}
public void addCommand(String key, Command command) {
if(!Objects.isNull(commandMap.get(key))) {
return;
}
logs(key, "是新加的命令");
commandMap.put(key, command);
}
public void action(String key) {
if(Objects.isNull(commandMap.get(key))) {
return;
}
Command command = commandMap.get(key);
logs(key, "被执行");
command.execute();
}
}
public class client {
public static void main(String[] args) {
// 接收命令者
Computer computer = new Computer();
// 具体命令
Command clickCommand = new ClickCommand(computer);
Command slidingRollerCommand = new SlidingRollerCommand(computer);
// 执行命令着
Mouse mouse = new Mouse();
mouse.addCommand(clickCommand.key, clickCommand);
mouse.addCommand(slidingRollerCommand.key, slidingRollerCommand);
mouse.action(clickCommand.key);
mouse.action(slidingRollerCommand.key);
System.out.println("-----------------------------");
mouse.showLogs();
}
}
click是新加的命令
sliding是新加的命令
click被执行
电脑响应
sliding被执行
电脑响应
-----------------------------
click是新加的命令
sliding是新加的命令
click被执行
sliding被执行
听懂掌声!类似的例子还有非常多,大家可以试着自己实现一版。
好啦,本期命令模式就到这里啦,希望本篇文章对你有所帮助!
愿每个人都能带着怀疑的态度去阅读文章并探究其中原理。
道阻且长,往事作序,来日为章。
期待我们下一次相遇!