设计模式总结之命令模式

命令模式:将请求封装成对象,以便使用不同的请求、队列、或者日志来参数化其他对象。命令模式也支持可撤销的操作。也就是说一个命令接收者可以绑定一系列请求,然后通过调用接受者的执行方法来执行就可以了。将一系命令通过一个命令的执行者来执行。

这里模仿一个用遥控器对点灯开关的命令模式。

package com.modedesign.command;
/**
 * @author ctt:
 * @version 创建时间:2016年5月13日 
 * 类说明
 */
public class SimpleRemoteControlWithUndo {
	Command[] onCommands;//这里可以根据情况来定义,执行方法时可根据情况去遍历执行命令
	Command[] offCommands;
	Command undoCommand;
	public SimpleRemoteControlWithUndo() {
		onCommands = new Command[5];
		offCommands = new Command[5];
		NoCommand noCommand = new NoCommand();
		for (int i = 0; i < 5; i++) {
			onCommands[i] = noCommand;
			offCommands[i] = noCommand;
		}
		undoCommand = noCommand;
	}
	
	public void setCommand(int slot,Command onCommand,Command offCommand){
		onCommands[slot] = onCommand;
		offCommands[slot] = offCommand;
	}
	public void onButtonWasPressed(int slot){
		onCommands[slot].excute();
		undoCommand = offCommands[slot];
	}
	public void offButtonWasPressed(int slot){
		offCommands[slot].excute();
		undoCommand = offCommands[slot];
 	}
	public void undoButtonWasPressed(){
		undoCommand.undo();
	}
	
}
package com.modedesign.command;
/**
 * @author ctt:
 * @version 创建时间:2016年5月13日 
 * 类说明 首先让所有的命令对象实现相同的包含一个方法的接口。即excute()
 * 和一个撤销的方法undo()
 */
public interface Command {
	public void excute();
	public void undo();
}
package com.modedesign.command;
/**
 * @author ctt:
 * @version 创建时间:2016年5月13日
 * 类说明
 */
public class CommandTest {
	public static void main(String[] args) {
		Light light = new Light();
		SimpleRemoteControlWithUndo controlWithUndo
						= new SimpleRemoteControlWithUndo();
		controlWithUndo.setCommand(0, new LightOnCommand(light),new LightOffCommand(light));	
		controlWithUndo.offButtonWasPressed(0);
		controlWithUndo.undoButtonWasPressed();
	}
}
package com.modedesign.command;
/**
 * @author ctt:
 * @version 创建时间:2016年5月13日 
 * 类说明 light类有两个方法,on和off
 */
public class Light {
	private boolean light;
	public void on(){
		light = true;
		System.out.println("the light is on");
	}
	public void off(){
		light = false;
		System.out.println("the light is off");
	}
}
package com.modedesign.command;
/**
 * @author ctt:
 * @version 创建时间:2016年5月13日 
 * 类说明
 */
public class LightOffCommand implements Command{
	private Light light;
	
	public LightOffCommand(Light light) {
		super();
		this.light = light;
	}

	@Override
	public void excute() {
		light.off();;
	}

	@Override
	public void undo() {
		light.on();
	}

}
package com.modedesign.command;
/**
 * @author ctt:
 * @version 创建时间:2016年5月13日 
 * 类说明实现打开电灯的命令。
 */
public class LightOnCommand implements Command{
	Light light;
	
	public LightOnCommand(Light light) {
		super();
		this.light = light;
	}

	@Override
	public void excute() {
		light.on();
	}

	@Override
	public void undo() {
		light.off();
	}

}
package com.modedesign.command;
/**
 * @author ctt:
 * @version 创建时间:2016年5月13日 
 * 类说明
 */
public class NoCommand implements Command{

	@Override
	public void excute() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void undo() {
		// TODO Auto-generated method stub
		
	}

}











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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值