设计模式:命令模式(command Pattern)
命令模式是对命令的封装。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。
?
我们使用遥控器的例子来说明一下命令模式
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;}/** * 执行命令:打开灯 */@Overridepublic void execute() {light.on();}}?
?
?
package com.kaishengit.command;//2.控制电视public class TurnTvCommand implements Command{private Tv tv;public TurnTvCommand (Tv tv){this.tv = tv;}@Overridepublic 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;}/** * 依次执行命令列表中的命令 */@Overridepublic 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....
?