Command

来源:互联网 发布:北京电脑编程学校 编辑:程序博客网 时间:2024/06/08 00:12

今天我在《Head First设计模式》这本书中学习了  命令模式 ,书中是讲的是做一个多种家电遥控器的例子。我也没有想到实现另外的用到这个模式的例子,所以这个模式,我就按照书上的例子来照本宣科咯。不过其中还是会假如一点自己的总结。

命令模式就是将执行命令的操作交给一个控制器来控制,并且实现松耦合,控制器可以动态地新增和删除命令


命令模式所有的类和接口我觉得可以分为 4 种 分别是  

1 真正执行命令的实体类(比如灯亮灯灭的电灯,开机关机的空调)。

2 命令类(为电灯的开、关分别设计了一个 开灯和关灯的命令类,为空调的开机、关机分别设计了一个 开机和关机的命令类) 

3 命令接口(2中的命令类必须实现此接口,我们才能把2中的类看做是命令类)

4 命令控制类(这个类主要是将命令类动态绑定到一个控制类中,我们姑且叫这个类叫遥控器)

下面我把书上例子的代码粘贴出来  注意上面创建类的顺序有点问题,应该先创建3  在创建2


1 新建真正执行命令的实体类

public class Light {public void lightOn(){System.out.println("打开灯");}public void lightOff(){System.out.println("关闭灯");}//其他操作...}public class AirCondition {public void AirConditionOn(){System.out.println("打开空调");}public void AirConditionOff(){System.out.println("关闭空调");}//其他操作...}

2 为电灯的开、关分别设计了一个 开灯和关灯的命令类,为空调的开机、关机分别设计了一个 开机和关机的命令类


public class LightOnCommand implements Command{private Light light;public LightOnCommand(Light light){this.light = light;}@Overridepublic void excute() {light.lightOn();}@Overridepublic void undo(){light.lightOff();}}public class LightOffCommand implements Command{private Light light;public LightOffCommand(Light light){this.light = light;}@Overridepublic void excute() {light.lightOff();}@Overridepublic void undo() {light.lightOn();}}public class AirConditionOnCommand implements Command{private AirCondition airCondition;public AirConditionOnCommand (AirCondition airCondition){this.airCondition = airCondition;}@Overridepublic void excute() {airCondition.AirConditionOn();}@Overridepublic void undo() {airCondition.AirConditionOff();}}public class AirConditionOffCommand implements Command{private AirCondition airCondition;public AirConditionOffCommand(AirCondition airCondition){this.airCondition = airCondition;}@Overridepublic void excute() {airCondition.AirConditionOff();}@Overridepublic void undo() {airCondition.AirConditionOn();}}

3 命令接口

public interface Command {//所有命令都必须实现这个接口/** * 执行命令 */void excute();/** * 撤销命令 */void undo();}

4 命令控制类

public class CommandInvoke {//命令调用类(折相当于是一个控制器)private Command[] command;public CommandInvoke(){command = new Command[4];}public void setCommand(int position,Command command){this.command[position] = command;}public void invoke(int position){command[position].excute();}}

5 新建测试类

public class InvokeTest {public static void main(String[] args) throws InterruptedException{Light light = new Light();AirCondition airCondition = new AirCondition();Command command = new LightOnCommand(light);Command command2 = new LightOffCommand(light);Command command3 = new AirConditionOnCommand(airCondition);Command command4 = new AirConditionOffCommand(airCondition);CommandInvoke commandInvoke = new CommandInvoke();commandInvoke.setCommand(0,command);commandInvoke.setCommand(1,command2);commandInvoke.setCommand(2,command3);commandInvoke.setCommand(3,command4);commandInvoke.invoke(0);Thread.sleep(2000);commandInvoke.invoke(2);Thread.sleep(2000);commandInvoke.invoke(1);Thread.sleep(2000);commandInvoke.invoke(3);}}

输出结果

打开灯
打开空调
关闭灯
关闭空调



原创粉丝点击