<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    dream.in.java

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

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



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

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

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

     

    ===============   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;

    //關(guān)機命令
    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;

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

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


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

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

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

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

     

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

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

     

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

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

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

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

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

     

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

     

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

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

        接口比如java.lang.Runnable。

     

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

        態(tài)就可以記錄用戶的連續(xù)操作。這樣通過執(zhí)行隊列中的command對象,就可以完成"Play back"操作了。

     

      8 Networking
        通過網(wǎng)絡(luò)發(fā)送command命令到其他機器上運行。

     

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

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


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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 精品国产_亚洲人成在线| 亚洲国产精品专区| 国产免费久久久久久无码| vvvv99日韩精品亚洲| 成人免费观看男女羞羞视频| 亚洲AV日韩精品一区二区三区| 中文有码亚洲制服av片| 免费无码肉片在线观看| 亚洲综合一区二区国产精品| 鲁死你资源站亚洲av| 国产片AV片永久免费观看| 亚洲网站在线播放| 久久aa毛片免费播放嗯啊| 在线亚洲人成电影网站色www| 色多多免费视频观看区一区| 男女交性永久免费视频播放| 亚洲一级特黄特黄的大片| 久久国内免费视频| 亚洲国产成+人+综合| 动漫黄网站免费永久在线观看 | a级毛片在线免费| 中文字幕精品亚洲无线码二区| 四虎影视在线看免费观看| 亚洲国产V高清在线观看| 一二三区免费视频| 亚洲香蕉网久久综合影视| 99久久国产精品免费一区二区| 亚洲第一AV网站| 亚欧日韩毛片在线看免费网站| 亚洲综合无码一区二区| 精品免费人成视频app| 亚洲综合国产成人丁香五月激情 | 久久狠狠爱亚洲综合影院| 嘿嘿嘿视频免费网站在线观看| 亚洲国产成人精品青青草原| 日韩欧美一区二区三区免费观看| 亚洲欧洲国产综合AV无码久久 | 国产精品亚洲一区二区无码| 亚洲免费一区二区| 国产偷国产偷亚洲清高APP| 国产无遮挡裸体免费视频|