对象行为型模式之命令模式 重要等级4难度等级4

适用条件:系统需要请求调用者和接受者解耦,是的调用者和接收者不直接交互。请求调用者无须知道接收者的存在,也无须知道接收者是谁,接收者也无须关心何时被调用。系统需要在不同的时间制定请求、将请求排队和执行请求。一个命令对象和请求的初始调用者可以游不同的生命周期,换言之,最初的请求发出者可能已经不存在了,而命令对象本身仍然是活动的,可以通过该命令对象去调用请求接收者,而无须关心请求调用者的存在性。系统需要支持命令的Undo(撤销)和Redo(恢复)操作。可以将命令对象存储起来,如果客户端需要撤销命令,则可通过调用Undo()方法撤销命令所产生的效果,还可以提供redo()方法,以供客户端在需要时重新执行命令。(开关:请求发起者,灯:请求接收者 ,线:封装(关灯和开灯)请求的命令对象)换一根电线,相同的开管即可 操纵不同的电气设备,提供了系统的灵活性。

实际应用:Java语言适用命令模式实现AWT/Swing GUI 的委派时间模型(Delegation Event Model.DEM)。再AWT/Swing 中,Frame、Button等界面组件是请求发送这,而接口的子类来实现事件的处理,即实现具体命令类,而在具体命令类中可以调用业务处理方法来实现该事件的处理。对于界面组件而言,只需要了解命令接口即可,无须关心接口的实现,组件类并不关心实际操作,而操作由用户来实现。在实现时,可以结合观察者模式,将具体命令对象注册到组件类中,组件在事件触发时将回调(callback)具体命令类中定义的事件处理方法,从而实现事件处理。 此外就是在宏命令功能上的体现,可以将多条命令封装在一个命令对象中,只需要一条简单的命令即可执行一个命令序列,这也是命令模式的应用实例之一。

定义:将一个请求封装成一个对象(本质),从而使我们可以用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。

模式结构图:


源代码:

示例:电视机遥控器

客户端:

package com.commandpattern.hing;

public class Client {
	public static void main(String args[]) {
		AbstractCommand openCommand, closeCommand, changeCommand;
		openCommand = new TVOpenCommand();
		closeCommand = new TVCloseCommand();
		changeCommand = new TVChangeCommand();
		Controller control = new Controller(openCommand, closeCommand, changeCommand);
		control.open();
		control.close();
		control.chang();
	}
}

抽象命令类:

package com.commandpattern.hing;

public interface AbstractCommand {
	public void execute();
}

具体命令类:

package com.commandpattern.hing;

public class TVChangeCommand implements AbstractCommand{
	private Television tv = new Television();
	@Override
	public void execute() {
		tv.change();
	}
	
}
package com.commandpattern.hing;

public class TVCloseCommand implements AbstractCommand {
	private Television tv = new Television();
	@Override
	public void execute() {
		tv.close();
	}

}
package com.commandpattern.hing;

public class TVOpenCommand implements AbstractCommand {
	private Television tv = new Television();
	@Override
	public void execute() {
		tv.open();
	}
}

调用者类:

package com.commandpattern.hing;

public class Controller {
	private AbstractCommand openCommand, closeCommand, changeCommand;
	public  Controller(AbstractCommand openCommand,AbstractCommand closeCommand,AbstractCommand changeCommand) {
		this.openCommand = openCommand;
		this.closeCommand = closeCommand;
		this.changeCommand = changeCommand;
	}
	public void open() {
		openCommand.execute();
	}
	public void close() {
		closeCommand.execute();
	}
	public void chang() {
		changeCommand.execute();
	}
}

接收者:

package com.commandpattern.hing;

public class Television {
	public void open() {
		System.out.println("打开电视机!");
	}
	public void close() {
		System.out.println("关闭电视机!");
	}
	public void change() {
		System.out.println("电视机换台!");
	}
}

总结:命令模式在实际的用途中还是比较广泛,像计算机中的撤回操作,可以说是一个特别好特别实用的功能,在这里举例的电视机遥控器例子中,遥控器就作为一个调用者类,电视机作为一个接收者类,而相应的请求则被封装成对象,在这些对象中,每一个都有接收者类Television的实例,因此在进行请求时,可以统一使用同一方法execute来进行多种行为的调用。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值