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

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

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

    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 閱讀(153) 評論(0)  編輯  收藏 所屬分類: OO & Patterns


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


    網站導航:
     
    主站蜘蛛池模板: 未满十八18禁止免费无码网站| 日韩精品免费在线视频| 免费毛片网站在线观看| 亚洲一区中文字幕在线电影网| 亚洲成人免费网址| 亚洲电影在线播放| 国产美女在线精品免费观看| 亚洲国产综合在线| 成人五级毛片免费播放| 亚洲国产成人久久综合| 人人狠狠综合久久亚洲高清| 男性gay黄免费网站| 国外亚洲成AV人片在线观看| 最近免费字幕中文大全| 日韩精品一区二区亚洲AV观看| 91成人在线免费视频| 亚洲中文字幕一二三四区苍井空| 最近免费中文字幕4| 精品在线观看免费| 国产亚洲精品国看不卡| 日韩在线不卡免费视频一区| 亚洲成aⅴ人片在线影院八| 免费电视剧在线观看| 免费人成再在线观看网站| 亚洲精品无码久久一线| 在线观看永久免费| 在线精品自拍亚洲第一区| 精品亚洲成α人无码成α在线观看| 野花香在线视频免费观看大全| 中文字幕亚洲综合久久2| 永久免费看mv网站入口| 久久免费国产精品| 亚洲91精品麻豆国产系列在线| 国产免费无遮挡精品视频| 免费观看成人久久网免费观看| 亚洲AV成人影视在线观看| 国产成人99久久亚洲综合精品| 最近中文字幕电影大全免费版 | 国产亚洲情侣一区二区无码AV| 成全视频在线观看免费| 亚洲中文字幕无码av|