dream.in.java

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

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



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

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

            1、 Control.java        命令控制者對(duì)象類
            2、 Tv.java             命令接收者對(duì)象類
            3、 Command.java        命令接口類
            4、 CommandChannel.java 頻道切換命令類
            5、 CommandOff.java     關(guān)機(jī)命令類
            6、 CommandOn.java      開機(jī)命令類
            7、 CommandTest.java    帶有main方法的測(cè)試類(命令發(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)機(jī)命令
          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;

          //開機(jī)命令
          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();
              //開機(jī)命令
              CommandOn on = new CommandOn(myTv);
              //關(guān)機(jī)命令
              CommandOff off = new CommandOff(myTv);
              //頻道切換命令
              CommandChannel channel = new CommandChannel(myTv, 2);
              //命令控制對(duì)象
              Control control = new Control( on, off, channel);

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


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

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

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

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

           

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

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

           

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

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

              置到該command對(duì)象中,當(dāng)最后一個(gè)wizard頁(yè)面用戶按下“Finish”按鈕時(shí),可以簡(jiǎn)單地觸發(fā)一個(gè)事件

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

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

           

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

           

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

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

              接口比如java.lang.Runnable。

           

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

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

           

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

           

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

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


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 临泉县| 咸阳市| 遂宁市| 溆浦县| 维西| 星子县| 赞皇县| 克拉玛依市| 东城区| 盐山县| 湘潭县| 长寿区| 凭祥市| 奉节县| 前郭尔| 泗洪县| 耿马| 隆子县| 永寿县| 大冶市| 安远县| 吉林省| 平陆县| 墨玉县| 延津县| 黑山县| 交口县| 麻江县| 郯城县| 元阳县| 延津县| 仙居县| 乌拉特前旗| 渭南市| 阿尔山市| 湘阴县| 宁明县| 金阳县| 乌鲁木齐县| 宜兴市| 桃江县|