读书人

设计形式:命令模式(command Pattern)

发布时间: 2012-09-14 11:53:44 作者: rapoo

设计模式:命令模式(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....

?

读书人网 >软件开发

热点推荐