zoukankan      html  css  js  c++  java
  • 设计模式 7 —— 命令模式

    设计模式目录:

    设计模式 1 ——观察者模式

    设计模式 2 —— 装饰者模式 

    设计模式 3 —— 迭代器和组合模式(迭代器)

    设计模式 4 —— 迭代器和组合模式(组合)

    设计模式 5 —— 工厂模式

    设计模式 6 —— 单件模式

    设计模式 7 —— 命令模式

    设计模式 8 —— 适配器和外观模式

    设计模式 9 —— 模板方法模式

    设计模式 10 —— 状态模式

    概述

    第1部分 问题引入

    第2部分 定义和实现

    第3部分 使用宏命令

    第1部分 问题引入

     首先看下,下面的要求:

    实现命令接口

    首先,让说有的命令对象实现相同的包含一个方法的接口。

    1 /**
    2  * 命令接口
    3  * @ClassName: Command
    4  * @author Xingle
    5  * @date 2014-9-11 上午10:13:46
    6  */
    7 public interface Command {
    8     public void execute();
    9 }

    实现一个打开电灯的命令

    在实现打开电灯或者关闭电灯之前,先看下灯的类

     1 public class Light {
     2     
     3     public Light(){} 
     4     
     5     //开灯
     6     public void on(){
     7         System.out.println("Light is on");
     8     }
     9 
    10     //关灯
    11     public void off(){
    12         System.out.println("Light is off");
    13     }
    14 }

    接着开灯以及关灯命令:

     1 /**
     2  * 实现一个开灯命令
     3  * @ClassName: LightOnCommand
     4  * TODO
     5  * @author Xingle
     6  * @date 2014-9-11 上午10:25:19
     7  */
     8 public class LightOnCommand implements Command{
     9     
    10     Light light;
    11     
    12     public LightOnCommand(Light light){
    13         this.light = light;
    14     }
    15 
    16     @Override
    17     public void execute() {
    18         light.on();
    19     }
    20 
    21 }
     1 /**
     2  * 实现一个关灯命令
     3  * @ClassName: LightOffCommand
     4  * TODO
     5  * @author Xingle
     6  * @date 2014-9-11 上午10:55:35
     7  */
     8 public class LightOffCommand implements Command{
     9 
    10     Light light;
    11     
    12     public LightOffCommand(Light light){
    13         this.light = light;
    14     };
    15     
    16     @Override
    17     public void execute() {
    18         light.off();        
    19     }
    20 
    21 }

    使用命令对象

    假设我们有一个遥控器,它只有一个按钮和对应的插槽,可以控制一个装置:

     1 //
     2 //This is the invoker
     3 //
     4 public class SimpleRemoteControl {
     5     //一个插槽持有命令,控制着一个装置
     6     Command slot;
     7     
     8     public SimpleRemoteControl(){};
     9     
    10     //这个方法用来设置插槽控制的命令。如果客户想要改变遥控器按钮的行为,可以多次调用这个方法
    11     public void setCommand(Command command){
    12         slot = command;
    13     }
    14     //当按下按钮时,这个方法就会被调用,使得当前命令衔接插槽,并调用它的execute()方法
    15     public void buttonWasPressed(){
    16         slot.execute();
    17     }
    18 }

    下面再多加一个控制车库门的命令,车库门以及命令如下:

     1 /**
     2  * 车库门
     3  * @ClassName: GarageDoor 
     4  * @author Xingle
     5  * @date 2014-9-11 上午10:53:15
     6  */
     7 public class GarageDoor {
     8     public GarageDoor() {
     9     }
    10 
    11     public void up() {
    12         System.out.println("Garage Door is Open");
    13     }
    14 
    15     public void down() {
    16         System.out.println("Garage Door is Closed");
    17     }
    18 
    19     public void stop() {
    20         System.out.println("Garage Door is Stopped");
    21     }
    22 
    23     public void lightOn() {
    24         System.out.println("Garage light is on");
    25     }
    26 
    27     public void lightOff() {
    28         System.out.println("Garage light is off");
    29     }
    30 }
     1 /**
     2  * 开车库门命令
     3  * @ClassName: GarageDoorOpenCommand
     4  * TODO
     5  * @author Xingle
     6  * @date 2014-9-11 上午10:53:52
     7  */
     8 public class GarageDoorOpenCommand implements Command{
     9 
    10     GarageDoor garageDoor;
    11     
    12     public GarageDoorOpenCommand(GarageDoor garageDoor) {
    13         this.garageDoor = garageDoor;
    14     }
    15     
    16     @Override
    17     public void execute() {
    18         garageDoor.up();
    19     }
    20 }

    遥控器使用的简单测试:

     1 /**
     2  * 遥控器的测试程序
     3  * @ClassName: RemoteControlTest
     4  * TODO
     5  * @author Xingle
     6  * @date 2014-9-11 上午10:57:38
     7  */
     8 public class RemoteControlTest {
     9     public static void main(String[] args){
    10         //遥控器就是调用者,会传入一个命令对象,可以用来发出请求
    11         SimpleRemoteControl remote = new SimpleRemoteControl();
    12         
    13         //创建了一个电灯对象,也就是请求的接受者
    14         Light light = new Light();
    15         GarageDoor garageDoor = new GarageDoor();
    16         //创建一个命令,然后将接受者传给它
    17         LightOnCommand lightOn = new LightOnCommand(light);
    18         GarageDoorOpenCommand garageOpen = new GarageDoorOpenCommand(garageDoor);
    19 
    20         //把命令传给调用者
    21         remote.setCommand(lightOn);
    22         //模拟按下按钮
    23         remote.buttonWasPressed();
    24         
    25         remote.setCommand(garageOpen);
    26         remote.buttonWasPressed();
    27     }
    28 }

    执行结果:

    第2部分 定义和实现

    命令模式 将“请求”封装成对象,以便使用不用的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。

      一个命令对象通过在特定接受者上绑定一组动作来封装一个请求。要达到这一点,命令对象将动作和接受者包进对象中。这个对象只暴露一个execute() 方法,当此方法被调用的时候,接收者就会进行这些动作。从外面看,其他对象不知道究竟哪个接收者进行了哪些动作,只知道如果调用execute() 方法,请求的目的就能达到。

    将命令指定到插槽

      将遥控器的每个插槽,对应到一个命令,这样就让遥控器变成“调用者”。当按下按钮,相应的命令对象的execute() 方法就会被调用,其结果是,接收者(例如:电灯、音响,电扇)的动作被调用。

    实现遥控器

     1 /**
     2  * 带有撤销的遥控器
     3  * @ClassName: RemoteControlWithUndo 
     4  * @author Xingle
     5  * @date 2014-9-11 下午12:18:47
     6  */
     7 public class RemoteControlWithUndo {
     8 
     9     Command[] onCommands;
    10     Command[] offCommands;
    11     //前一个命令将被记录在这里
    12     Command undoCommand;
    13 
    14     public RemoteControlWithUndo() {
    15         //遥控器要处理7个开与关的命令,使用相应数组记录这些命令
    16         onCommands = new Command[7];
    17         offCommands = new Command[7];
    18         //空对象
    19         Command noCommand = new NoCommand();
    20         
    21         for (int i = 0; i < 7; i++) {
    22             onCommands[i] = noCommand;
    23             offCommands[i] = noCommand;
    24         }
    25         undoCommand = noCommand;
    26     }
    27 
    28     public void setCommand(int slot, Command onCommand, Command offCommand) {
    29         onCommands[slot] = onCommand;
    30         offCommands[slot] = offCommand;
    31     }
    32 
    33     public void onButtonWasPushed(int slot) {
    34         onCommands[slot].execute();
    35         undoCommand = onCommands[slot];
    36     }
    37 
    38     public void offButtonWasPushed(int slot) {
    39         offCommands[slot].execute();
    40         undoCommand = offCommands[slot];
    41     }
    42 
    43     public void undoButtonWasPushed() {
    44         undoCommand.undo();
    45     }
    46 
    47     public String toString() {
    48         StringBuffer stringBuff = new StringBuffer();
    49         stringBuff.append("
    ------ Remote Control -------
    ");
    50         for (int i = 0; i < onCommands.length; i++) {
    51             stringBuff.append("[slot " + i + "] "
    52                     + onCommands[i].getClass().getName() + "    "
    53                     + offCommands[i].getClass().getName() + "
    ");
    54         }
    55         stringBuff.append("[undo] " + undoCommand.getClass().getName() + "
    ");
    56         return stringBuff.toString();
    57     }
    58 
    59 }

    命令接口

    1 public interface Command {
    2     
    3     public void execute();
    4     
    5     //撤销操作
    6     public void undo();
    7 
    8 }

    灯 的类

     1 /**
     2  * 灯
     3  * @ClassName: Light
     4  * TODO
     5  * @author Xingle
     6  * @date 2014-9-11 上午11:52:57
     7  */
     8 public class Light {
     9     String location = "";
    10 
    11     public Light(String location) {
    12         this.location = location;
    13     }
    14 
    15     public void on() {
    16         System.out.println(location + " light is on");
    17     }
    18 
    19     public void off() {
    20         System.out.println(location + " light is off");
    21     }
    22 }

    实现命令

     1 /**
     2  * 开灯
     3  * @ClassName: LightOnCommand
     4  * TODO
     5  * @author Xingle
     6  * @date 2014-9-11 上午11:52:18
     7  */
     8 public class LightOnCommand implements Command{
     9     Light light ;
    10 
    11     public LightOnCommand(Light light){
    12         this.light = light;
    13     }
    14     @Override
    15     public void execute() {
    16         light.on();
    17     }
    18     @Override
    19     public void undo() {
    20         light.off();
    21     }
    22 
    23 }
     1 /**
     2  * 关灯
     3  * @ClassName: LightOffCommand 
     4  * @author Xingle
     5  * @date 2014-9-11 下午12:00:05
     6  */
     7 public class LightOffCommand implements Command {
     8 
     9     Light light;
    10 
    11     public LightOffCommand(Light light) {
    12         this.light = light;
    13     }
    14 
    15     @Override
    16     public void execute() {
    17         light.off();
    18     }
    19     
    20     @Override
    21     public void undo() {
    22         light.on();
    23     }
    24 
    25 }

    音响

     1 /**
     2  * 音响
     3  * @ClassName: Stereo
     4  * TODO
     5  * @author Xingle
     6  * @date 2014-9-11 上午11:54:46
     7  */
     8 public class Stereo {
     9     
    10     String location;
    11 
    12     public Stereo(String location) {
    13         this.location = location;
    14     }
    15 
    16     public void on() {
    17         System.out.println(location + " stereo is on");
    18     }
    19 
    20     public void off() {
    21         System.out.println(location + " stereo is off");
    22     }
    23 
    24     public void setCD() {
    25         System.out.println(location + " stereo is set for CD input");
    26     }
    27 
    28     public void setDVD() {
    29         System.out.println(location + " stereo is set for DVD input");
    30     }
    31 
    32     public void setRadio() {
    33         System.out.println(location + " stereo is set for Radio");
    34     }
    35 
    36     public void setVolume(int volume) {
    37         System.out.println(location + " Stereo volume set to " + volume);
    38     }
    39 
    40 }

    音响的命令操作

     1 /**
     2  * 开音响
     3  * @ClassName: StereoOnWithCDCommand
     4  * TODO
     5  * @author Xingle
     6  * @date 2014-9-11 上午11:54:19
     7  */
     8 public class StereoOnWithCDCommand implements Command{
     9 
    10     Stereo stereo;
    11     
    12     public StereoOnWithCDCommand(Stereo stereo) {
    13         this.stereo = stereo;
    14     }
    15  
    16     @Override
    17     public void execute() {
    18         stereo.on();
    19     }
    20 
    21     @Override
    22     public void undo() {
    23         stereo.off();
    24     }
    25 
    26 }
     1 /**
     2  * 关音响
     3  * @ClassName: StereoOffCommand
     4  * TODO
     5  * @author Xingle
     6  * @date 2014-9-11 下午12:03:02
     7  */
     8 public class StereoOffCommand implements Command{
     9     Stereo stereo;
    10     
    11     public StereoOffCommand(Stereo stereo) {
    12         this.stereo = stereo;
    13     }
    14 
    15     @Override
    16     public void execute() {
    17         stereo.off();
    18     }
    19 
    20     @Override
    21     public void undo() {
    22         stereo.on();
    23     }
    24 
    25 }

    吊扇

     1 /**
     2  * 吊扇
     3  * 
     4  * @ClassName: CeilingFan 
     5  * @author Xingle
     6  * @date 2014-9-11 下午12:36:04
     7  */
     8 public class CeilingFan {
     9 
    10     
    11     public static final int HIGH = 3;
    12     public static final int MEDIUM = 2;
    13     public static final int LOW = 1;
    14     public static final int OFF = 0;
    15     String location;
    16     int speed;
    17 
    18     public CeilingFan(String location) {
    19         this.location = location;
    20         speed = OFF;
    21     }
    22 
    23     //高速
    24     public void high() {
    25         speed = HIGH;
    26         System.out.println(location + " ceiling fan is on high");
    27     }
    28     //中速
    29     public void medium() {
    30         speed = MEDIUM;
    31         System.out.println(location + " ceiling fan is on medium");
    32     }
    33     //低速
    34     public void low() {
    35         speed = LOW;
    36         System.out.println(location + " ceiling fan is on low");
    37     }
    38     //关闭
    39     public void off() {
    40         speed = OFF;
    41         System.out.println(location + " ceiling fan is off");
    42     }
    43 
    44     public int getSpeed() {
    45         return speed;
    46     }
    47 
    48 }

    电扇的三个命令,分别把电扇开到高速,中速,和低速

     1 /**
     2  * 开电扇到高速
     3  * @ClassName: CeilingFanHighCommand 
     4  * @author Xingle
     5  * @date 2014-9-11 下午12:37:20
     6  */
     7 public class CeilingFanHighCommand implements Command {
     8 
     9     CeilingFan ceilingFan;
    10     int prevSpeed;
    11 
    12     public CeilingFanHighCommand(CeilingFan ceilingFan) {
    13         this.ceilingFan = ceilingFan;
    14     }
    15 
    16     @Override
    17     public void execute() {
    18         prevSpeed = ceilingFan.getSpeed();
    19         ceilingFan.high();
    20     }
    21 
    22     @Override
    23     public void undo() {
    24         if (prevSpeed == CeilingFan.HIGH) {
    25             ceilingFan.high();
    26         } else if (prevSpeed == CeilingFan.MEDIUM) {
    27             ceilingFan.medium();
    28         } else if (prevSpeed == CeilingFan.LOW) {
    29             ceilingFan.low();
    30         } else if (prevSpeed == CeilingFan.OFF) {
    31             ceilingFan.off();
    32         }
    33     }
    34 
    35 }
     1 /**
     2  * 开电扇到中速
     3  * @ClassName: CeilingFanMediumCommand
     4  * TODO
     5  * @author Xingle
     6  * @date 2014-9-11 下午12:39:57
     7  */
     8 public class CeilingFanMediumCommand implements Command{
     9     CeilingFan ceilingFan;
    10     int prevSpeed;
    11 
    12     public CeilingFanMediumCommand(CeilingFan ceilingFan) {
    13         this.ceilingFan = ceilingFan;
    14     }
    15     @Override
    16     public void execute() {
    17         prevSpeed = ceilingFan.getSpeed();
    18         ceilingFan.medium();
    19     }
    20 
    21     @Override
    22     public void undo() {
    23         if (prevSpeed == CeilingFan.HIGH) {
    24             ceilingFan.high();
    25         } else if (prevSpeed == CeilingFan.MEDIUM) {
    26             ceilingFan.medium();
    27         } else if (prevSpeed == CeilingFan.LOW) {
    28             ceilingFan.low();
    29         } else if (prevSpeed == CeilingFan.OFF) {
    30             ceilingFan.off();
    31         }
    32     }
    33 }
     1 /**
     2  * 开电扇到低速
     3  * @ClassName: CeilingFanLowCommand
     4  * TODO
     5  * @author Xingle
     6  * @date 2014-9-11 下午12:38:25
     7  */
     8 public class CeilingFanLowCommand implements Command{
     9     
    10     CeilingFan ceilingFan;
    11     int prevSpeed;
    12   
    13     public CeilingFanLowCommand(CeilingFan ceilingFan) {
    14         this.ceilingFan = ceilingFan;
    15     }
    16 
    17     @Override
    18     public void execute() {
    19         prevSpeed = ceilingFan.getSpeed();
    20         ceilingFan.low();
    21     }
    22 
    23     @Override
    24     public void undo() {
    25         if (prevSpeed == CeilingFan.HIGH) {
    26             ceilingFan.high();
    27         } else if (prevSpeed == CeilingFan.MEDIUM) {
    28             ceilingFan.medium();
    29         } else if (prevSpeed == CeilingFan.LOW) {
    30             ceilingFan.low();
    31         } else if (prevSpeed == CeilingFan.OFF) {
    32             ceilingFan.off();
    33         }
    34     }
    35 
    36 }

    关电扇命令

     1 /**
     2  * 关电扇
     3  * @ClassName: CeilingFanOffCommand
     4  * TODO
     5  * @author Xingle
     6  * @date 2014-9-11 下午12:45:18
     7  */
     8 public class CeilingFanOffCommand implements Command{
     9     
    10     CeilingFan ceilingFan;
    11     int prevSpeed;
    12   
    13     public CeilingFanOffCommand(CeilingFan ceilingFan) {
    14         this.ceilingFan = ceilingFan;
    15     }
    16 
    17     @Override
    18     public void execute() {
    19         prevSpeed = ceilingFan.getSpeed();
    20         ceilingFan.off();
    21     }
    22 
    23     @Override
    24     public void undo() {
    25         if (prevSpeed == CeilingFan.HIGH) {
    26             ceilingFan.high();
    27         } else if (prevSpeed == CeilingFan.MEDIUM) {
    28             ceilingFan.medium();
    29         } else if (prevSpeed == CeilingFan.LOW) {
    30             ceilingFan.low();
    31         } else if (prevSpeed == CeilingFan.OFF) {
    32             ceilingFan.off();
    33         }
    34     }
    35 
    36 }

    测试遥控器

     1 /**
     2  * 测试程序
     3  * 
     4  * @ClassName: RemoteLoader 
     5  * @author Xingle
     6  * @date 2014-9-11 上午11:57:26
     7  */
     8 public class RemoteLoader {
     9     public static void main(String[] args) {
    10     
    11         RemoteControlWithUndo remoteControl = new RemoteControlWithUndo();
    12 
    13         Light livingRoomLight = new Light("Living Room");
    14 
    15         CeilingFan ceilingFan = new CeilingFan("ww Room");
    16         
    17         
    18         
    19         LightOnCommand livingRoomLightOn = new LightOnCommand(livingRoomLight);
    20         LightOffCommand livingRoomLightOff = new LightOffCommand(livingRoomLight);
    21         
    22         CeilingFanMediumCommand ceilingFanMedium = new CeilingFanMediumCommand(ceilingFan);
    23         CeilingFanLowCommand ceilingFanLow = new CeilingFanLowCommand(ceilingFan);
    24         CeilingFanHighCommand ceilingFanHigh = new CeilingFanHighCommand(ceilingFan);
    25         CeilingFanOffCommand ceilingFanOff = new CeilingFanOffCommand(ceilingFan);
    26 
    27         //
    28         remoteControl.setCommand(0, livingRoomLightOn, livingRoomLightOff);        
    29         remoteControl.setCommand(1, ceilingFanMedium, ceilingFanOff);
    30         remoteControl.setCommand(2, ceilingFanHigh, ceilingFanOff);
    31 
    32         remoteControl.onButtonWasPushed(0);
    33         remoteControl.offButtonWasPushed(0);
    34         System.out.println(remoteControl);
    35         remoteControl.undoButtonWasPushed();
    36     
    37         remoteControl.onButtonWasPushed(1);//中速开
    38         remoteControl.offButtonWasPushed(1);//关闭
    39         System.out.println(remoteControl);
    40         remoteControl.undoButtonWasPushed();//撤销,会回到中速
    41         
    42         remoteControl.onButtonWasPushed(2);//高度开
    43         System.out.println(remoteControl);//
    44         remoteControl.undoButtonWasPushed();//撤销,回到中速
    45     }
    46 
    47 }

    执行结果:

    Living Room light is on
    Living Room light is off

    ------ Remote Control -------
    [slot 0] firsthead.command.remote.LightOnCommand firsthead.command.remote.LightOffCommand
    [slot 1] firsthead.command.remote.CeilingFanMediumCommand firsthead.command.remote.CeilingFanOffCommand
    [slot 2] firsthead.command.remote.CeilingFanHighCommand firsthead.command.remote.CeilingFanOffCommand
    [slot 3] firsthead.command.remote.NoCommand firsthead.command.remote.NoCommand
    [slot 4] firsthead.command.remote.NoCommand firsthead.command.remote.NoCommand
    [slot 5] firsthead.command.remote.NoCommand firsthead.command.remote.NoCommand
    [slot 6] firsthead.command.remote.NoCommand firsthead.command.remote.NoCommand
    [undo] firsthead.command.remote.LightOffCommand

    Living Room light is on
    ww Room ceiling fan is on medium
    ww Room ceiling fan is off

    ------ Remote Control -------
    [slot 0] firsthead.command.remote.LightOnCommand firsthead.command.remote.LightOffCommand
    [slot 1] firsthead.command.remote.CeilingFanMediumCommand firsthead.command.remote.CeilingFanOffCommand
    [slot 2] firsthead.command.remote.CeilingFanHighCommand firsthead.command.remote.CeilingFanOffCommand
    [slot 3] firsthead.command.remote.NoCommand firsthead.command.remote.NoCommand
    [slot 4] firsthead.command.remote.NoCommand firsthead.command.remote.NoCommand
    [slot 5] firsthead.command.remote.NoCommand firsthead.command.remote.NoCommand
    [slot 6] firsthead.command.remote.NoCommand firsthead.command.remote.NoCommand
    [undo] firsthead.command.remote.CeilingFanOffCommand

    ww Room ceiling fan is on medium
    ww Room ceiling fan is on high

    ------ Remote Control -------
    [slot 0] firsthead.command.remote.LightOnCommand firsthead.command.remote.LightOffCommand
    [slot 1] firsthead.command.remote.CeilingFanMediumCommand firsthead.command.remote.CeilingFanOffCommand
    [slot 2] firsthead.command.remote.CeilingFanHighCommand firsthead.command.remote.CeilingFanOffCommand
    [slot 3] firsthead.command.remote.NoCommand firsthead.command.remote.NoCommand
    [slot 4] firsthead.command.remote.NoCommand firsthead.command.remote.NoCommand
    [slot 5] firsthead.command.remote.NoCommand firsthead.command.remote.NoCommand
    [slot 6] firsthead.command.remote.NoCommand firsthead.command.remote.NoCommand
    [undo] firsthead.command.remote.CeilingFanHighCommand

    ww Room ceiling fan is on medium

    第3部分 使用宏命令

    宏命令(macro command), 即多个命令的组合操作。

     1 /**
     2  * 宏命令
     3  * @ClassName: MacroCommand
     4  * TODO
     5  * @author Xingle
     6  * @date 2014-9-11 下午3:09:38
     7  */
     8 public class MacroCommand implements Command{
     9     
    10     Command[] commands;
    11      
    12     public MacroCommand(Command[] commands) {
    13         this.commands = commands;
    14     }
    15 
    16     @Override
    17     public void execute() {
    18         for (int i = 0; i < commands.length; i++) {
    19             commands[i].execute();
    20         }
    21     }
    22 
    23     @Override
    24     public void undo() {
    25         for (int i = commands.length -1; i >= 0; i--) {
    26             commands[i].undo();
    27         }
    28     }
    29 
    30 }
     1 /**
     2  * 遥控
     3  * @ClassName: RemoteControl
     4  * TODO
     5  * @author Xingle
     6  * @date 2014-9-11 下午3:04:43
     7  */
     8 public class RemoteControl {
     9     Command[] onCommands;
    10     Command[] offCommands;
    11     Command undoCommand;
    12  
    13     public RemoteControl() {
    14         onCommands = new Command[7];
    15         offCommands = new Command[7];
    16  
    17         Command noCommand = new NoCommand();
    18         for(int i=0;i<7;i++) {
    19             onCommands[i] = noCommand;
    20             offCommands[i] = noCommand;
    21         }
    22         undoCommand = noCommand;
    23     }
    24   
    25     public void setCommand(int slot, Command onCommand, Command offCommand) {
    26         onCommands[slot] = onCommand;
    27         offCommands[slot] = offCommand;
    28     }
    29  
    30     public void onButtonWasPushed(int slot) {
    31         onCommands[slot].execute();
    32         undoCommand = onCommands[slot];
    33     }
    34  
    35     public void offButtonWasPushed(int slot) {
    36         offCommands[slot].execute();
    37         undoCommand = offCommands[slot];
    38     }
    39 
    40     public void undoButtonWasPushed() {
    41         undoCommand.undo();
    42     }
    43  
    44     public String toString() {
    45         StringBuffer stringBuff = new StringBuffer();
    46         stringBuff.append("
    ------ Remote Control -------
    ");
    47         for (int i = 0; i < onCommands.length; i++) {
    48             stringBuff.append("[slot " + i + "] " + onCommands[i].getClass().getName()
    49                 + "    " + offCommands[i].getClass().getName() + "
    ");
    50         }
    51         stringBuff.append("[undo] " + undoCommand.getClass().getName() + "
    ");
    52         return stringBuff.toString();
    53     }
    54 }

    测试程序:

     1 /**
     2  * 带宏的测试程序
     3  * @ClassName: RemoteLoader
     4  * TODO
     5  * @author Xingle
     6  * @date 2014-9-11 下午3:04:18
     7  */
     8 public class RemoteLoader {
     9     public static void main(String[] args) {
    10 
    11         RemoteControl remoteControl = new RemoteControl();
    12         Light light = new Light("Living Room");    
    13         Stereo stereo = new Stereo("Living Room");
    14          
    15         LightOnCommand lightOn = new LightOnCommand(light);
    16         StereoOnCommand stereoOn = new StereoOnCommand(stereo);
    17         LightOffCommand lightOff = new LightOffCommand(light);
    18         StereoOffCommand stereoOff = new StereoOffCommand(stereo);
    19 
    20         //一个数组记录开启命令
    21         Command[] partyOn = { lightOn,  stereoOn};
    22         //一个数组记录关闭命令
    23         Command[] partyOff = { lightOff, stereoOff};
    24   
    25         /**
    26          * 创建两个对应的宏持有它们
    27          */
    28         MacroCommand partyOnMacro = new MacroCommand(partyOn);
    29         MacroCommand partyOffMacro = new MacroCommand(partyOff);
    30  
    31         //将宏命令指定给一个按钮
    32         remoteControl.setCommand(0, partyOnMacro, partyOffMacro);
    33   
    34         System.out.println(remoteControl);
    35         System.out.println("--- Pushing Macro On---");
    36         remoteControl.onButtonWasPushed(0);
    37         System.out.println("--- Pushing Macro Off---");
    38         remoteControl.offButtonWasPushed(0);
    39     }
    40 }

    执行结果:


    ------ Remote Control -------
    [slot 0] firsthead.command.party.MacroCommand firsthead.command.party.MacroCommand
    [slot 1] firsthead.command.party.NoCommand firsthead.command.party.NoCommand
    [slot 2] firsthead.command.party.NoCommand firsthead.command.party.NoCommand
    [slot 3] firsthead.command.party.NoCommand firsthead.command.party.NoCommand
    [slot 4] firsthead.command.party.NoCommand firsthead.command.party.NoCommand
    [slot 5] firsthead.command.party.NoCommand firsthead.command.party.NoCommand
    [slot 6] firsthead.command.party.NoCommand firsthead.command.party.NoCommand
    [undo] firsthead.command.party.NoCommand

    --- Pushing Macro On---
    Light is on
    Living Room stereo is on
    --- Pushing Macro Off---
    Light is off
    Living Room stereo is off

  • 相关阅读:
    .Net Core ----通过XUnit进行接口单元测试(带请求头及参数)并用output输出结果
    .Net Core---- 通过EPPlus批量导出
    .Net Core---- 自带Json返回日期带T格式 解决
    You need tcl 8.5 or newer in order to run the Redis test
    exec: "docker-proxy": executable file not found in $PATH
    docker 如何清理垃圾呢
    docker run 报错——WARNING: IPv4 forwarding is disabled. Networking will not work.
    go 依赖包管理工具gb安装报错
    keepalived实现nginx高可用
    php命令行查看扩展信息
  • 原文地址:https://www.cnblogs.com/xingele0917/p/3966326.html
Copyright © 2011-2022 走看看