人在江湖

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            82 Posts :: 10 Stories :: 169 Comments :: 0 Trackbacks

          參考 http://en.wikipedia.org/wiki/Command_pattern

          Command Design Pattern Class Diagram.png

          /*the Invoker class*/
          public class Switch {
           
              private Command flipUpCommand;
              private Command flipDownCommand;
           
              public Switch(Command flipUpCmd, Command flipDownCmd) {
                   this.flipUpCommand = flipUpCmd;
                   this.flipDownCommand = flipDownCmd;
              }
           
              public void flipUp() {
                   flipUpCommand.execute();
              }
           
              public void flipDown() {
                   flipDownCommand.execute();
              }
          }
           
          /*Receiver class*/
          public class Light {
           
               public Light() {  }
           
               public void turnOn() {
                  System.out.println("The light is on");
               }
           
               public void turnOff() {
                  System.out.println("The light is off");
               }
          }
           
          /*the Command interface*/
          public interface Command {
              void execute();
          }
           
          /*the Command for turning on the light*/
          public class FlipUpCommand implements Command {
           
             private Light theLight;
           
             public FlipUpCommand(Light light) {
                  this.theLight=light;
             }
           
             public void execute(){
                theLight.turnOn();
             }
          }
           
          /*the Command for turning off the light*/
          public class FlipDownCommand implements Command {
           
             private Light theLight;
           
             public FlipDownCommand(Light light) {
                  this.theLight=light;
             }
           
             public void execute() {
                theLight.turnOff();
             }
          }
           
          /*The test class or client*/
          public class PressSwitch {
           
             public static void main(String[] args) {
                 Light lamp = new Light();
                 Command switchUp = new FlipUpCommand(lamp);
                 Command switchDown = new FlipDownCommand(lamp);
           
                 // See criticism of this model above:
                 // The switch itself should not be aware of lamp details (switchUp, switchDown) 
                 // either directly or indirectly
                 Switch s = new Switch(switchUp,switchDown);
           
                 try {
                     if (args[0].equalsIgnoreCase("ON")) {
                          s.flipUp();
                     } else if (args[0].equalsIgnoreCase("OFF")) {
                         s.flipDown();
                     } else {
                         System.out.println("Argument \"ON\" or \"OFF\" is required.");
                     }
                 } catch (Exception e){
                     System.out.println("Arguments required.");
                 }
             }
          }
          =====================

          java tip (http://www.javaworld.com/javaworld/javatips/jw-javatip68.html?page=3) 給了類似的例子,多了Fan作為receiver:

          TestCommand.java
          class Fan {
                  public void startRotate() {
                          System.out.println("Fan is rotating");
                  }
                  public void stopRotate() {
                          System.out.println("Fan is not rotating");
                  }
          }
          class Light {
                  public void turnOn( ) {
                          System.out.println("Light is on ");
                  }
                  public void turnOff( ) {
                          System.out.println("Light is off");
                  }
          }
          class Switch {
                  private Command UpCommand, DownCommand;
                  public Switch( Command Up, Command Down) {
                          UpCommand = Up; // concrete Command registers itself with the invoker
                          DownCommand = Down;
                  }
                  void flipUp( ) { // invoker calls back concrete Command, which executes the Command on the receiver
                                  UpCommand . execute ( ) ;                          
                  }
                  void flipDown( ) {
                                  DownCommand . execute ( );
                  }
          }
          class LightOnCommand implements Command {
                  private Light myLight;
                  public LightOnCommand ( Light L) {
                          myLight  =  L;
                  }
                  public void execute( ) {
                          myLight . turnOn( );
                  }
          }
          class LightOffCommand implements Command {
                  private Light myLight;
                  public LightOffCommand ( Light L) {
                          myLight  =  L;
                  }
                  public void execute( ) {
                          myLight . turnOff( );
                  }
          }
          class FanOnCommand implements Command {
                  private Fan myFan;
                  public FanOnCommand ( Fan F) {
                          myFan  =  F;
                  }
                  public void execute( ) {
                          myFan . startRotate( );
                  }
          }
          class FanOffCommand implements Command {
                  private Fan myFan;
                  public FanOffCommand ( Fan F) {
                          myFan  =  F;
                  }
                  public void execute( ) {
                          myFan . stopRotate( );
                  }
          }
          public class TestCommand {
                          public static void main(String[] args) {
                                  Light  testLight = new Light( );
                                  LightOnCommand testLOC = new LightOnCommand(testLight);
                                  LightOffCommand testLFC = new LightOffCommand(testLight);
                                  Switch testSwitch = new Switch( testLOC,testLFC);      
                                  testSwitch.flipUp( );
                                  testSwitch.flipDown( );
                                  Fan testFan = new Fan( );
                                  FanOnCommand foc = new FanOnCommand(testFan);
                                  FanOffCommand ffc = new FanOffCommand(testFan);
                                  Switch ts = new Switch( foc,ffc);
                                  ts.flipUp( );
                                  ts.flipDown( );
                          }
          }              
          Command.java
          public interface Command {
                  public abstract void execute ( );
          }

          posted on 2011-02-12 23:25 人在江湖 閱讀(1561) 評論(0)  編輯  收藏 所屬分類: design pattern
          主站蜘蛛池模板: 谢通门县| 会东县| 阜康市| 比如县| 泉州市| 榆树市| 隆德县| 永靖县| 兰溪市| 西和县| 奉节县| 漯河市| 临高县| 黎平县| 瓦房店市| 呼图壁县| 三江| 博白县| 西畴县| 遂溪县| 南木林县| 富源县| 通渭县| 张北县| 涞水县| 常山县| 池州市| 桐梓县| 祁阳县| 哈巴河县| 盱眙县| 内黄县| 阳山县| 灌阳县| 镇坪县| 汕尾市| 封开县| 高邮市| 东辽县| 灵武市| 贡嘎县|