命令模式定义:将请求封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。
应用场景:某公司需要制作有6个插槽的遥控器,遥控器上每个插槽对应两个按钮,分别是开和关,用来控制用户屋内的各种设备的开关,包括电灯、微波炉等等,他们希望,电灯或者其他设备的插头插进遥控器的任意一个插槽,遥控器都能实现对该设备的控制。
分析:既然需要电灯或者其他设备的插头插进遥控器的任意一个插槽,遥控器都能实现对该设备的控制,意思是用户控制遥控器只需发出请求的命令,而请求与设备之间的关系,遥控器无需关注。
代码文件:
各种电灯的统一接口:
package com.design.command;
/**
* 各种电灯的统一接口
* @author Administrator
*
*/
public interface Light {
public void on();
public void off();
}
接下来,我们实现两种电灯设备,一种的是屋外的灯,还有一种屋内的灯
package com.design.command;
/**
* 门外的灯
* @author Administrator
*
*/
public class OutdoorLight implements Light{
/**
* 开灯
*/
public void on() {
System.out.println("OutdoorLight on");
}
/**
* 关灯
*/
public void off() {
System.out.println("OutdoorLight off");
}
}
package com.design.command;
/**
* 屋内的灯
* @author Administrator
*
*/
public class InnerdoorLight implements Light{
/**
* 开灯
*/
public void on() {
System.out.println("InnerdoorLight on");
}
/**
* 关灯
*/
public void off() {
System.out.println("InnerdoorLight off");
}
}
package com.design.command;
/**
* 各种命令的统一接口
* @author Administrator
*
*/
public interface Command {
/**
* 开
*/
public void on();
/**
* 关
*/
public void off();
}
实现该接口,用做电灯请求命令:
package com.design.command;
public class LightCommand implements Command{
private Light light;
public LightCommand(Light light){
this.light = light;
}
/**
* 开灯
*/
public void on() {
light.on();
}
/**
* 关灯
*/
public void off() {
light.off();
}
public Light getLight() {
return light;
}
public void setLight(Light light) {
this.light = light;
}
}
我们做下测试:
package com.design.command;
/**
* 测试类
* @author Administrator
*
*/
public class CommandTest {
public static void main(String[] args) {
Light outdoorLight = new OutdoorLight();
LightCommand lightCommand = new LightCommand(outdoorLight);
//用户只需按下按钮,发出请求,至于请求与被请求者之间的关系,用户无须关注
//打开屋外的灯
User user = new User();
user.setCommand(lightCommand);
user.buttonPressedOn();
//打开屋内的灯
Light innerdoorLight = new InnerdoorLight();
lightCommand.setLight(innerdoorLight);
user.setCommand(lightCommand);
user.buttonPressedOn();
}
}
测试结果:
从测试代码中,可以看出,用户无需关注命令如果处理被请求者,用户只需发出命令即可。这也实现了用户与设备之间的解耦。