问题:命令模式有什么用?将动作的请求者从动作的执行者中解耦,比如说现在有两个类电视和电灯都有on()和off()两个方法,我们需要设计一个遥控器类来控制电视和点灯的打开或者关闭;
public class Light {
public void on(){
System.out.println("灯打开了");
}
public void off(){
System.out.println("灯关闭了");
}
}
public class Tv {
public void on(){
System.out.println("电视打开了");
}
public void off(){
System.out.println("电视关闭了");
}
}
//所有命令对象都需要实现此接口
public interface Command {
public void execute();
}
//这是一个命令,所以需要事先Command接口
public class LightOn implements Command{
Light light;
//构造器传入了电灯,以便被命令控制,然后记录在实例变量中,一旦调用execute,就由这个电灯成为接受者,负责接收请求
public LightOn(Light light){
this.light = light;
}
//这个execute用于接收对象的的on方法
public void execute() {
light.on();
}
}
//这是一个命令,所以需要事先Command接口
public class LightOff implements Command{
Light light;
//构造器传入了电灯,以便被命令控制,然后记录在实例变量中,一旦调用execute,就由这个电灯成为接受者,负责接收请求
public LightOff(Light light){
this.light = light;
}
//这个execute用于接收对象的的off方法
public void execute() {
light.off();
}
}
public class TvOn implements Command{
Tv tv;
public TvOn(Tv tv){
this.tv = tv;
}
//这个execute用于接收对象的的on方法
public void execute() {
tv.on();
}
}
public class TvOff implements Command{
Tv tv;
public TvOff(Tv tv){
this.tv = tv;
}
//这个execute用于接收对象的的on方法
public void execute() {
tv.off();
}
}
//遥控器,负责使用命令对象
public class SimpleRemoteController {
//有一个插槽持有命令,这个命令控制着一个装置
Command command;
public SimpleRemoteController(){}
//这个方法用来设置插槽控制的命令,如果想要改变遥控器按钮的行为,可以多次调用这个方法
public void setCommand(Command command){
this.command = command;
}
//当按下按钮的时候,这个方法会被调用,调用当前命令的execute方法
public void button(){
command.execute();
}
}
//这是命令模式的客户
public class Test {
public static void main(String[] args) {
//遥控器就是调用者,会传入一个命令对象,用来发出请求
SimpleRemoteController simpleRemoteController = new SimpleRemoteController();
//创建一个请求接受者对象
Light light = new Light();
//创建一个命令对象,将请求接受者传给过来
LightOn on = new LightOn(light);
simpleRemoteController.setCommand(on);
simpleRemoteController.button();
LightOff off = new LightOff(light);
simpleRemoteController.setCommand(off);
simpleRemoteController.button();
Tv tv = new Tv();
TvOn tvOn = new TvOn(tv);
simpleRemoteController.setCommand(tvOn);
simpleRemoteController.button();
TvOff tvOff = new TvOff(tv);
simpleRemoteController.setCommand(tvOff);
simpleRemoteController.button();
}
}
测试结果:
命令模式:将“请求”封装成对象,以便使用不同的请求,队列或者日志来参数化其他对象,命令模式也支持撤销的操作;
UML:
命令模式的好处:
1.降低对象之间的耦合度。
2.新的命令可以很容易地加入到系统中。
3.可以比较容易地设计一个组合命令。
4.调用同一方法实现不同的功能
命令模式的缺点:
使用命令模式可能会导致某些系统有过多的具体命令类。因为针对每一个命令都需要设计一个具体命令类,因此某些系统可能需要大量具体命令类,这将影响命令模式的使用。
版权声明:本文为dx94sg原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。