asklxf

          A java developer's notebook.

          常用鏈接

          統(tǒng)計

          積分與排名

          最新評論

          狀態(tài)模式之星際應(yīng)用

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

          狀態(tài)模式的UML圖如下:

          按此在新窗口打開圖片

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

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

          public interface State {
              public void fire();
          }


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

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

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


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

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


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

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


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

          普通狀態(tài)每秒開槍1次。
          興奮狀態(tài)每秒開槍2次。


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

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

          (參考:Design Patterns)

          posted on 2005-12-02 10:32 Xuefeng's Weblog 閱讀(154) 評論(0)  編輯  收藏 所屬分類: OO & Patterns


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 武清区| 若羌县| 运城市| 梅州市| 叙永县| 宁国市| 探索| 瑞安市| 宾阳县| 卓资县| 诸城市| 延安市| 新源县| 临城县| 霸州市| 昆山市| 卢湾区| 环江| 成都市| 鲁甸县| 龙川县| 武夷山市| 安达市| 东港市| 庄浪县| 卢氏县| 营口市| 贵德县| 邵阳县| 张北县| 大新县| 江都市| 利川市| 新平| 建瓯市| 辰溪县| 靖西县| 青龙| 昭苏县| 化德县| 娱乐|