设计模式之命令模式-使用命令模式实现遥控器及总结
先来看看项目结构:
说明:
1:命令接口对象
2:电灯打开或关闭命令
3:音响打开或关闭命令
4:音响音量增加或减少命令
来源:凯哥Java(kaigejava)
电灯开或关代码:
/**
-
Created by kaigejava on 2019/8/30.
- 关灯的命令对象
*/
public class LightOffCommand implements ICommandInterface{
private LightAPI light;
public LightOffCommand(LightAPI light){
this.light = light;
}
@Override
public void execute() {
light.Off();
}
@Override
public void undo() {
light.On();
}
}
增加音响音量的类:
/**
-
Created by kaigejava on 2019/8/30.
- 给音响增加音量命令对象
*/
public class StereoAddVolCommand implements ICommandInterface{
private StereoAPI setreo;
public StereoAddVolCommand(StereoAPI stereo){
this.setreo = stereo;
}
@Override
public void execute() {
int vol= setreo.GetVol();
if(vol<11)
{
setreo.AddVolume(++vol);
}
}
@Override
public void undo() {
int vol= setreo.GetVol();
if(vol>0)
{
setreo.downVolume(--vol);
}
}
}
命令模式总结:
1:内容
什么是命令模式?命令模式定义。参见上一篇
2:角色
invoker:调用者(如遥控器对象)
Command:命令接口或抽象类(如命令案例中命令接口)
received命令具体实现类(如电灯开对象、音响音量加/减对象)
3:执行顺序
调用者-->接收者-->命令
4:使用场景
当行为的请求者与行为的实现者之间需要解耦的时候(如遥控器项目,请求者是遥控器,行动实现者是各个不同的家电设备),这种场景下可以使用
5:何时使用
在某些场合,比如要对行为进行"记录、撤销/重做、事务"等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。在某些场合,比如要对行为进行"记录、撤销/重做、事务"等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。
6:优缺点
优点:
1、降低了系统耦合度;
2、新的命令可以很容易添加到系统中去。
缺点:
使用命令模式可能会导致某些系统有过多的具体命令类。比如我们遥控器项目中就多了很多具体命令对象。
联系凯哥--》凯哥Java(kaigejava)或凯哥个人博客:www.kaigejava.com 博客上私聊凯哥哦~
7:注意事项
系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作,也可以考虑使用命令模式