首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 互联网 >

下令模式(Command Pattern)_Java

2013-11-02 
命令模式(Command Pattern)_JavaCommand Pattern?餐厅中的命令模式: 客人给服务员下菜单,服务员记录下来,

命令模式(Command Pattern)_Java

Command Pattern


下令模式(Command Pattern)_Java
?

餐厅中的命令模式:
客人给服务员下菜单,服务员记录下来,给厨师,让厨师做出美丽的菜肴!
这其中,客户是跟厨师见不着的,对于程序来说即降低了耦合度。

我们再以遥控器为例,说一下命令模式

小红按下了手中的遥控器的开按钮,遥控器给电视发送开的命令,电视接收到命令后执行开的动作,电视被打开。小红看完了电视,按下关的按钮,同样,遥控器控制电视关的操作,这期间,小红是不用接触到电视机的。

下面用程序实现此命令模式

package com.pattern.command;/** * 遥控器 */public class Remoter {/** * 遥控器按钮按下,要执行一个命令 */public void buttonPress(Command cmd){cmd.execute();}}

?

package com.pattern.command;/** * 命令接口,每一个命令都有一个execute方法 */public interface Command {public void execute();}

?

package com.pattern.command;/** * 打开电视命令,实现了命令接口,提供有执行命令的方法 */public class OpenTvCommand implements Command {//命令作用的对象private Tv tv;//执行电视打开之前,需要有一个电视public OpenTvCommand(Tv tv){this.tv=tv;}//让电视执行打开方法@Overridepublic void execute() {tv.open();}}

?

package com.pattern.command;/** * 电视,具有打开和关闭的方法 * 遥控器调用不同的命令来操作电视具有的方法 */public class Tv {public void open(){System.out.println("TV open...");}public void close(){System.out.println("TV close...");}}

?

package com.pattern.command;/** * 关闭电视命令 */public class CloseTvCommand implements Command {private Tv tv;public CloseTvCommand(Tv tv){this.tv=tv;}@Overridepublic void execute() {tv.close();}}

?

package com.pattern.command;public class Test {public static void main(String[] args) {Tv tv=new Tv();//买了一个电视Remoter remoter=new Remoter();//电视配有一个遥控器OpenTvCommand openCommand=new OpenTvCommand(tv);//给这个电视配置了打开命令//遥控器按下打开命令,电视被打开remoter.buttonPress(openCommand);//TV open...CloseTvCommand closeCommand=new CloseTvCommand(tv);remoter.buttonPress(closeCommand);//TV close...}}

?

今天我买了一个超级遥控器,把所有的命令装进去,我只需要按相应的按钮就可以了
SuperRemoter

?

package com.pattern.command1;import java.util.ArrayList;import java.util.List;public class SuperRemoter {private List<Command> cmds=new ArrayList<Command>();public void add(Command... args){for (Command command : args) {cmds.add(command);}}public void buttonPress(int index){cmds.get(index-1).execute();}}

?

package com.pattern.command1;public class Test {public static void main(String[] args) {Tv tv=new Tv();//买了一个电视Remoter remoter=new Remoter();//电视配有一个遥控器OpenTvCommand openCommand=new OpenTvCommand(tv);//给这个电视配置了打开命令//遥控器按下打开命令,电视被打开remoter.buttonPress(openCommand);//TV open...CloseTvCommand closeCommand=new CloseTvCommand(tv);remoter.buttonPress(closeCommand);//TV close...//***************今天我买了一个超级遥控器SuperRemoter sr=new SuperRemoter();sr.add(openCommand,closeCommand);//把电视的所有命令都装进去了,按下第几个键就可以了sr.buttonPress(1);//执行第一个命令sr.buttonPress(2);//执行第二个命令}}

?

过几天,我又有新想法了,能不能让我的超级遥控器,按下某一个按钮,同时帮我打开电视和电灯呢!!
这里要使用宏命令了,什么是宏命令呢?就是一个操作可以完成多个命令!

package com.pattern.command1;public class Light {public void open(){System.out.println("Light open...");}public void close(){System.out.println("Light close...");}}

?

package com.pattern.command1;/** * 打开电灯命令,实现了命令接口,提供有执行命令的方法 */public class OpenLightCommand implements Command {//命令作用的对象private Light light;//执行电灯打开之前,需要有一个电灯public OpenLightCommand(Light light){this.light=light;}//让电灯执行打开方法@Overridepublic void execute() {light.open();}}

?

package com.pattern.command1;public class MarcoCommand implements Command{private Command[] cmds;public MarcoCommand(Command... cmds){this.cmds=cmds;}@Overridepublic void execute() {for (Command command : cmds) {command.execute();}}}

?

package com.pattern.command1;public class Test {public static void main(String[] args) {Tv tv=new Tv();//买了一个电视Remoter remoter=new Remoter();//电视配有一个遥控器OpenTvCommand openCommand=new OpenTvCommand(tv);//给这个电视配置了打开命令//遥控器按下打开命令,电视被打开remoter.buttonPress(openCommand);//TV open...CloseTvCommand closeCommand=new CloseTvCommand(tv);remoter.buttonPress(closeCommand);//TV close...//***************今天我买了一个超级遥控器SuperRemoter sr=new SuperRemoter();sr.add(openCommand,closeCommand);//把电视的所有命令都装进去了,按下第几个键就可以了sr.buttonPress(1);//执行第一个命令sr.buttonPress(2);//执行第二个命令//******************我一到家,我就按下一个按钮,就打开我的电视和电灯了!!!Light light=new Light();OpenLightCommand openLightCommand=new OpenLightCommand(light);MarcoCommand mc=new MarcoCommand(openCommand,openLightCommand);sr.add(mc);sr.buttonPress(3);//TV open...   Light open...}}

?

?

热点排行