dream.in.java

          能以不變應萬變是聰明人做事的準則。萬事從小事做起,積累小成功,問鼎大成功,是成功者的秘訣。

          設計模式_命令模式(帶例)



          寫在前面:
          意圖(Intent):
              將一個請求封裝為一個對象,從而使你可用不同的請求對客戶進行參數化;對請求排隊或記錄請求日志,以及支持可撤消的操作。
                                                                                    -------《設計模式》GOF
          結構圖(Struct):
                         

          廣泛,遵循一定的編程模式,才能使自己的代碼便于理解,易于交流,Command(命令模式)模式是比較常用的一個模式.
             Command命令模式: Command模式通過被稱為Command的類封裝了對目標對象的調用行為以及調用參數。將一個請求封裝為一個對象,從而使你不同的請求對客戶進行參數化;對請求排隊或記錄請求日志,以及支持可撤銷的操作。
             優點: 解耦了調用者和接受者之間聯系。調用者調用一個操作,接受者接受請求執行相應的動作,因為使用Command模式解耦,調用者無需知道接受者任何接口。
             缺點: 造成出現過多的具體命令類
            
             在此寫了7個java類來描述說明Command設計模式的實現方式;

            1、 Control.java        命令控制者對象類
            2、 Tv.java             命令接收者對象類
            3、 Command.java        命令接口類
            4、 CommandChannel.java 頻道切換命令類
            5、 CommandOff.java     關機命令類
            6、 CommandOn.java      開機命令類
            7、 CommandTest.java    帶有main方法的測試類(命令發送者)

           

          ===============   1、 Control.java
          package command;

          //命令控制者
          public class Control {
            private Command onCommand, offCommand, changeChannel;

            public Control(Command on, Command off, Command channel) {
              onCommand = on;
              offCommand = off;
              changeChannel = channel;
            }

            public void turnOn() {
              onCommand.execute();
            }

            public void turnOff() {
              offCommand.execute();
            }

            public void changeChannel() {
              changeChannel.execute();
            }
          }
          ===============   1 end

           

          ===============   2、 Tv.java
          package command;

          //命令接收者
          public class Tv {

            public int currentChannel = 0;

            public void turnOn() {
              System.out.println("The televisino is on.");
            }

            public void turnOff() {
              System.out.println("The television is off.");
            }

            public void changeChannel(int channel) {
              this.currentChannel = channel;
              System.out.println("Now TV channel is " + channel);
            }
          }
          ===============   2 end

           

          ===============   3、 Command.java
          package command;

          //命令接口
          public interface Command {
            void execute();
          }
          ===============   3 end

           

          ===============   4、 CommandChannel.java
          package command;

          //頻道切換命令
          public class CommandChannel implements Command {
            private Tv myTv;

            private int channel;

            public CommandChannel(Tv tv, int channel) {
              myTv = tv;
              this.channel = channel;
            }

            public void execute() {
              myTv.changeChannel(channel);
            }
          }
          ===============   4 end

           

          ===============   5、 CommandOff.java
          package command;

          //關機命令
          public class CommandOff implements Command {
            private Tv myTv;

            public CommandOff(Tv tv) {
              myTv = tv;
            }

            public void execute() {
              myTv.turnOff();
            }
          }
          ===============   5 end

           

          ===============   6、 CommandOn.java
          package command;

          //開機命令
          public class CommandOn implements Command {
            private Tv myTv;

            public CommandOn(Tv tv) {
              myTv = tv;
            }

            public void execute() {
              myTv.turnOn();
            }
          }
          ===============   6 end

           

          ===============   7、 CommandTest.java
          package command;

          //命令發送者
          public class CommandTest{
            public static void main(String[] args){
              //命令接收者
              Tv  myTv = new Tv();
              //開機命令
              CommandOn on = new CommandOn(myTv);
              //關機命令
              CommandOff off = new CommandOff(myTv);
              //頻道切換命令
              CommandChannel channel = new CommandChannel(myTv, 2);
              //命令控制對象
              Control control = new Control( on, off, channel);

              //開機
              control.turnOn();
              //切換頻道
              control.changeChannel();
              //關機
              control.turnOff();
            }
          }
          ===============   7 end


            Command模式通常可應用到以下場景:
            1 Multi-level undo(多級undo操作)
              如果系統需要實現多級回退操作,這時如果所有用戶的操作都以command對象的形式實現,系統可以簡

              單地用stack來保存最近執行的命令,如果用戶需要執行undo操作,系統只需簡單地popup一個最近的

              command對象然后執行它的undo()方法既可。
           
            2 Transactional behavior(原子事務行為)
              借助command模式,可以簡單地實現一個具有原子事務的行為。當一個事務失敗時,往往需要回退到執

              行前的狀態,可以借助command對象保存這種狀態,簡單地處理回退操作。

           

            3 Progress bars(狀態條)
              假如系統需要按順序執行一系列的命令操作,如果每個command對象都提供一個

              getEstimatedDuration()方法,那么系統可以簡單地評估執行狀態并顯示出合適的狀態條。

           

            4 Wizards(導航)
              通常一個使用多個wizard頁面來共同完成一個簡單動作。一個自然的方法是使用一個command對象來封

              裝wizard過程,該command對象在第一個wizard頁面顯示時被創建,每個wizard頁面接收用戶輸入并設

              置到該command對象中,當最后一個wizard頁面用戶按下“Finish”按鈕時,可以簡單地觸發一個事件

              調用execute()方法執行整個動作。通過這種方法,command類不包含任何跟用戶界面有關的代碼,可以

              分離用戶界面與具體的處理邏輯。

           

            5 GUI buttons and menu items(GUI按鈕與菜單條等等)
              Swing系統里,用戶可以通過工具條按鈕,菜單按鈕執行命令,可以用command對象來封裝命令的執行。

           

            6 Thread pools(線程池)
              通常一個典型的線程池實現類可能有一個名為addTask()的public方法,用來添加一項工作任務到任務

              隊列中。該任務隊列中的所有任務可以用command對象來封裝,通常這些command對象會實現一個通用的

              接口比如java.lang.Runnable。

           

            7 Macro recording(宏紀錄)
              可以用command對象來封裝用戶的一個操作,這樣系統可以簡單通過隊列保存一系列的command對象的狀

              態就可以記錄用戶的連續操作。這樣通過執行隊列中的command對象,就可以完成"Play back"操作了。

           

            8 Networking
              通過網絡發送command命令到其他機器上運行。

           

            9 Parallel Processing(并發處理)
              當一個調用共享某個資源并被多個線程并發處理時。

          posted on 2009-04-08 19:49 YXY 閱讀(163) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 两当县| 武清区| 海阳市| 罗江县| 汤原县| 龙口市| 宜宾县| 蓬溪县| 英吉沙县| 吕梁市| 杭锦后旗| 浙江省| 象州县| 卫辉市| 安义县| 南京市| 泉州市| 大化| 蓝山县| 修水县| 阿拉尔市| 渝中区| 高青县| 中卫市| 黑龙江省| 防城港市| 陵川县| 泰和县| 富民县| 专栏| 灵璧县| 博罗县| 六盘水市| 二手房| 海盐县| 永丰县| 马鞍山市| 武汉市| 金寨县| 海安县| 二连浩特市|