命令模式
- 命令模式在设计模式中属于行为型模式;
- 在日常开发中也是比较常用的模式,只是可能我们没有意识到这属于命令模式;
- 命令模式主要关注点在于请求发送方和请求接收方的解耦;
- 命令模式基于java多态的特性,非常简单;
在日常生活中也存在命令模式的原型,比如说电视机和遥控器:
- 遥控器发送请求;
- 电视机接收请求;
- 电视机和遥控器是解耦的;
代码使用命令模式模拟电视机和遥控器
/**
* 命令接口
*/
public interface Cmd {
/**
* 执行
*/
void execute();
}
/**
* 电视机
*
* @author cans
* @date 2022/5/8
**/
public class Tv {
private int sound = 0;
/**
* 调大音量
*/
public synchronized void soundUp() {
sound++;
System.out.println("调大音量,当前音量: " + sound);
}
/**
* 调小音量
*/
public synchronized void soundDown() {
sound--;
System.out.println("调小音量,当前音量: " + sound);
}
}
/**
* 音量调大命令
*
* @author cans
* @date 2022/5/8
**/
public class SoundDownCmdImpl implements Cmd {
private final Tv tv;
public SoundDownCmdImpl(Tv tv) {
this.tv = tv;
}
@Override
public void execute() {
tv.soundDown();
}
}
/**
* 音量调大命令
*
* @author cans
* @date 2022/5/8
**/
public class SoundUpCmdImpl implements Cmd {
private final Tv tv ;
public SoundUpCmdImpl(Tv tv) {
this.tv = tv;
}
@Override
public void execute() {
tv.soundUp();
}
}
/**
* 遥控器
*
* @author cans
* @date 2022/5/8
**/
public class Control {
public static void call(Cmd cmd) {
cmd.execute();
}
public static void main(String[] args) {
Tv tv = new Tv();
Cmd cmd1 = new SoundUpCmdImpl(tv);
Cmd cmd2 = new SoundDownCmdImpl(tv);
Control.call(cmd1);
Control.call(cmd2);
}
}
执行结果:
调大音量,当前音量: 1
调小音量,当前音量: 0
总结
命令模式其实很简单
其核心就在于使用java多态的特性将动作封装在一个接口中
根据不同的实现类展现执行不同动作
当然这个代码只是最简单的实现,在现实不同的开发场景中还需要结合需求场景进行优化;
比如在前后端分离的开发模式下,前端不能将java对象直接传递给后端
这里就可以参考springMvc中handler的实现了