asklxf

          A java developer's notebook.

          常用鏈接

          統計

          積分與排名

          最新評論

          狀態模式之星際應用

          一個對象有多種狀態,在不同的狀態下,同一種方法有不同的行為。如果用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派生一個新類即可。

          (參考:Design Patterns)

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


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


          網站導航:
           
          主站蜘蛛池模板: 镇赉县| 进贤县| 肥东县| 英山县| 乌兰浩特市| 噶尔县| 新巴尔虎左旗| 新晃| 宜州市| 晴隆县| 河曲县| 北票市| 巴东县| 凯里市| 夹江县| 达尔| 乌拉特前旗| 邹平县| 定西市| 晋城| 朝阳区| 偃师市| 马山县| 太和县| 龙江县| 石渠县| 冕宁县| 汶上县| 南投市| 楚雄市| 垦利县| 宁津县| 紫云| 佳木斯市| 黑水县| 黄大仙区| 洮南市| 沐川县| 永平县| 岳普湖县| 牡丹江市|