设计模式心得:命令模式 (command pattern)

核心思想:将对对象的请求,或者说是命令,封装为对象。 这样可以解耦命令的实现以及命令的传达, 并且可以比较方便的将命令序列化,如队列化,等等


在这个封装的命令对象中,只暴露出execute()方法 (如果有需求, 也可以封装undo()方法)。


举例: 一个控制器,有若干个按钮,控制若干个元件。

首先,定义命令这个接口:

public interface Command {
	public void execute();
}

然后,封装所有可能的命令, 比如, 打开/关闭电视,调高/降低空调1度:

public class OpenTVCommand implements Command {
	TV tv;
	public OpenTVCommand(TV tv) {
		this.tv = tv;	
	}
	@override
	public void execute() {
		this.tv.on();	
	}
}

电视自然要实现on()的方法:

public class TV {
	//other methods....
	void on() {
		connectPower();
		searchSignal();
		System.out.println("TV " + this.name + " is on.");	
	}
}

有了命令的对象,控制器类的定义就显而易见了,直接把一个个对象塞到一个个按钮上就行了:

public class Controller {
	Command [] buttons;
	public Controller() {
		buttons = new Command(10); // 10 buttons
	}	
	public setCommand (int slot, Command command) {
		buttons[slot] = command;
	}
	public buttonPressed(int slot) {
		buttons[slot].execute();
	}
}


最后,实例化一个控制器玩玩:

	Controller controller = new Controller();
	TV testTV = new TV();
	testTV.setName("testTV");
 	button0Command = new OpenTVCommand(testTV);
	controller.setCommand(0, button0Command);
        controlled.buttonPressed(0);

</pre><pre>

就应该能显示TV testTV is on. 啦。


扩展: undo功能,最简单版的undo,就添加一个变量记录上一个Command是什么,直接调用就行了。

   宏扩展,设计一个Command类,这个类的execute()方法内含若干个Command的execute()方法。这种方法适用于批处理命令。

   队列化命令,当需要使用线程池的时候,主函数中可以把用户的命令对象直接推到线程队列里, 线程拿到命令对象后,直接执行execute()命令即可,无需知道execute()的具体实现。做到了线程和实现内容的解耦。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值