个人对命令模式的理解

  • Post author:
  • Post category:其他

问题:命令模式有什么用?将动作的请求者从动作的执行者中解耦,比如说现在有两个类电视和电灯都有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 版权协议,转载请附上原文出处链接和本声明。