之后定义开机、关机和换台的命令实现:
//开机命令ConcreteCommand public class CommandOn implements Command { private Tv myTv;//持有一个命令接受者的引用 public CommandOn(Tv tv) { //构造方法 myTv = tv; } public void execute() { //执行命令的方法 myTv.turnOn(); } } //关机命令ConcreteCommand public class CommandOff implements Command { private Tv myTv; public CommandOff(Tv tv) { myTv = tv; } public void execute() { myTv.turnOff(); } } //频道切换命令ConcreteCommand public class CommandChange implements Command { private Tv myTv; private int channel; public CommandChange(Tv tv, int channel) { myTv = tv; this.channel = channel; } public void execute() { myTv.changeChannel(channel); } } 再定义一个封装命令的Invoker类:Control //可以看作是遥控器Invoker public class Control { private Command onCommand, offCommand, changeChannel;//持有三种命令的引用 public Control(Command on, Command off, Command channel) {//构造方法 onCommand = on; offCommand = off; changeChannel = channel; } public void turnOn() { onCommand.execute(); } public void turnOff() { offCommand.execute(); } public void changeChannel() { changeChannel.execute(); } } 最后编写测试类: //测试类Client public class Client { public static void main(String[] args) { // 命令接收者Receiver Tv myTv = new Tv(); //初始化开机命令ConcreteCommond CommandOn on = new CommandOn(myTv); //初始化关机命令ConcreteCommond CommandOff off = new CommandOff(myTv); //初始化频道切换命令ConcreteCommond CommandChange channel = new CommandChange(myTv, 2); //初始化命令控制对象Invoker Control control = new Control(on, off, channel); // 通过遥控器可以实现三个命令操作。 // 开机 control.turnOn(); // 切换频道 control.changeChannel(); // 关机 control.turnOff(); } } 结果如下: The televisino is on. Now TV channel is 2 The television is off. 三、总结 1、命令模式的本质 对命令进行封装,将发出命令与执行命令的责任分开。每一个命令都是一个操作,请求的一方发出请求,要求执行一个操作;接收的一方收到请求,并执行操作。请求方和接收方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否被执行、何时被执行,以及是怎么被执行的。命令模式的关键在于引入了抽象命令接口,且发送者针对抽象命令接口编程,只有实现了抽象命令接口的具体命令才能与接收者相关联。 2、命令模式的优点: 解除了请求者与实现者之间的耦合,降低了系统的耦合度。 对请求排队或记录请求日志,支持撤销操作。 可以容易地设计一个组合命令。 新命令可以容易地加入到系统中。 3、命令模式的缺点 因为针对每一个命令都需要设计一个具体命令类,使用命令模式可能会导致系统有过多的具体命令类。