命令模式是对命令的封装。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。
我们使用遥控器的例子来说明一下命令模式
1>新建一个Command(命令)接口
package com.kaishengit.command; public interface Command { //命令对象方法 public void execute(); }
2>新建一个遥控器(发出命令对象)类:RemoteControl.java
package com.kaishengit.command; import java.util.ArrayList; import java.util.List; public class RemoteControl { //用于存放命令 private List<Command> commandList = new ArrayList<Command>(); /** * 向遥控器中添加命令 * @param command */ public void setCommand(Command command){ commandList.add(command); } /** * 按下按键执行第几个命令 * @param index */ public void buttonWasPressed(int index){ commandList.get(index - 1).execute(); } }
3>新建两个电器(执行命令对象):电灯类、电视类
package com.kaishengit.command; //1.电灯类 public class Light { public void on(){ System.out.println("灯亮了!"); } }
package com.kaishengit.command; //2.电视类 public class Tv { public void on(){ System.out.println("打开电视!"); } }
4>新建两个命令对象类(实现Command接口):控制电灯、控制电视
package com.kaishengit.command; //1.控制电灯 public class LightOnCommand implements Command{ private Light light; /** * 传入控制的对象:电灯 * @param light */ public LightOnCommand(Light light){ this.light = light; } /** * 执行命令:打开灯 */ @Override public void execute() { light.on(); } }
package com.kaishengit.command; //2.控制电视 public class TurnTvCommand implements Command{ private Tv tv; public TurnTvCommand (Tv tv){ this.tv = tv; } @Override public void execute() { tv.on(); } }
5>测试一下
package com.kaishengit.command; public class Test { public static void main(String[] args) { //创建遥控器 RemoteControl remoteControl = new RemoteControl(); //开灯命令 LightOnCommand lightOnCommand = new LightOnCommand(new Light()); //打开电视命令 TurnTvCommand turnTvCommand = new TurnTvCommand(new Tv()); //将命令捆绑到遥控器上 remoteControl.setCommand(turnTvCommand); remoteControl.setCommand(lightOnCommand); //按下按钮 remoteControl.buttonWasPressed(1);//执行第一个命令 //remoteControl.buttonWasPressed(2);//执行第二个命令 } }
执行结果:
---------------------------------
打开电视!
---------------------------------
ok....
宏命令:是对子命令的结合体,一连串命令。
比如这里,我们创建一个宏命令:先开灯,再开电视
1>新建一个宏命令对象(实现Command接口):MacroCommand.java
package com.kaishengit.command; //宏命令 public class MacroCommand implements Command{ private Command[] commands; /** * 传入命令列表 * @param commands */ public MacroCommand(Command...commands){ this.commands = commands; } /** * 依次执行命令列表中的命令 */ @Override public void execute() { for(Command command : commands){ command.execute(); } } }
2>我们测试一下我们新建的宏命令对象
package com.kaishengit.command; public class Test { public static void main(String[] args) { //创建遥控器 RemoteControl remoteControl = new RemoteControl(); //开灯命令 LightOnCommand lightOnCommand = new LightOnCommand(new Light()); //开电视命令 TurnTvCommand turnTvCommand = new TurnTvCommand(new Tv()); //我们创建的宏命令,传入命令列表:1.开灯命令、2.开电视命令 MacroCommand mc = new MacroCommand(lightOnCommand,turnTvCommand); //将宏命令捆绑到遥控器上 remoteControl.setCommand(mc); //按下按钮,执行宏命令 remoteControl.buttonWasPressed(1); } }
运行结果:
-------------------
灯亮了!
打开电视!
-------------------
ok。。。
关于命令模式
1.命令模式将发出请求的对象和执行请求的对象解耦
2.在被解耦的两者之间间是通过命令对象进行沟通的,命令对象封装了一个或一组动作
3.调用者通过调用命令对象的execute方法发出请求,这使得接收者对象的劢作被调用
4.宏命令是命令的一种简单延伸,允许调用多个命令
end....