狀態模式之星際應用(轉載)

          一個對象有多種狀態,在不同的狀態下,同一種方法有不同的行為。如果用swich-case語句,將有大量的條件分支和邏輯代碼混在一起。狀態模式將每個狀態封裝到一個獨立的類中,利用多態性使得不同狀態下同一種方法表現不同的行為。

          狀態模式的UML圖如下:

          按此在新窗口打開圖片

          星際中人族的機槍兵Marine有兩種狀態:普通狀態和打了興奮針后的狀態,兩種狀態下機槍兵的開槍頻率是不同的,我們用狀態模式來實現機槍兵的fire()方法。

          首先定義抽象狀態State接口,這個接口指定了機槍兵的fire行為:

          public interface State {
              public void fire();
          }


          State接口有一個fire()方法,我們實現兩個子類NormalState和ExcitedState,分別表示普通狀態和打了興奮針后的狀態,并實現具體的fire方法:

          public class NormalState implements State {
              public void fire() {
                 System.out.println("普通狀態每秒開槍1次。");
              }
          }

          public class ExcitedState implements State {
              public void fire() {
                 System.out.println("興奮狀態每秒開槍2次。");
              }
          }


          最后,定義機槍兵類Marine,每個Marine的實例代表一個機槍兵:

          public class Marine {
              // 保持一個狀態類的實例:
              private State state = new NormalState();
           
              // 為機槍兵設置狀態:
              public void setState(State state) {
                 this.state = state;
              }
           
              // fire()方法,實際調用的是state變量的fire()方法:
              public void fire() {
                 state.fire();
              }
          }


          最后我們看看如何在客戶端控制一個機槍兵的狀態:

          public static void main(String[] args) {
              // 創建一個機槍兵的實例:
              Marine marine = new Marine();
              // 調用fire()方法:
              marine.fire();
              // 設置為興奮狀態:
              marine.setState(new ExcitedState());
              // 再調用fire()方法:
              marine.fire();
          }


          對同一個Marine對象調用兩次fire()方法,屏幕輸出為:

          普通狀態每秒開槍1次。
          興奮狀態每秒開槍2次。


          可見機槍兵在兩種狀態下的同一個fire()方法有不同的行為。

          使用狀態模式的好處是每個狀態被封裝到一個獨立的類中,這些類可以獨立變化,而主對象中沒有繁瑣的swich-case語句,并且添加新的狀態非常容易,只需要從State派生一個新類即可。

          posted on 2007-04-05 09:21 feeling 閱讀(173) 評論(0)  編輯  收藏


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


          網站導航:
           
          <2007年4月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          導航

          統計

          常用鏈接

          留言簿(3)

          隨筆分類(2)

          隨筆檔案(13)

          文章分類

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 龙游县| 万山特区| 垣曲县| 林周县| 满城县| 清水县| 宁远县| 彩票| 许昌县| 英吉沙县| 慈利县| 中宁县| 静海县| 玉树县| 车致| 都安| 修文县| 理塘县| 巴中市| 阿坝县| 郯城县| 桐庐县| 互助| 大姚县| 邵武市| 镇巴县| 繁昌县| 本溪市| 华亭县| 松原市| 五峰| 贡嘎县| 霍林郭勒市| 峨边| 阿鲁科尔沁旗| 甘洛县| 佛冈县| 容城县| 邢台县| 石家庄市| 郸城县|