人在江湖

            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
          主站蜘蛛池模板: 缙云县| 江陵县| 那曲县| 德清县| 榆林市| 合水县| 石柱| 隆昌县| 祁阳县| 石家庄市| 普兰店市| 南木林县| 平昌县| 阳高县| 永川市| 康保县| 阳朔县| 乐都县| 阿拉善左旗| 肇东市| 攀枝花市| 阿图什市| 丰县| 睢宁县| 冷水江市| 松桃| 宁蒗| 车致| 涿鹿县| 涟水县| 忻州市| 德安县| 敖汉旗| 邢台市| 永仁县| 赤壁市| 团风县| 大洼县| 类乌齐县| 邛崃市| 宣化县|