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

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

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

    夢幻之旅

    DEBUG - 天道酬勤

       :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      671 隨筆 :: 6 文章 :: 256 評論 :: 0 Trackbacks

    狀態模式

    狀態模式:允許對象在內部狀態改變時改變它的行為,對象看起來好像修改了它的類。
    狀態模式的組成部份:
    1.環境,是一個類,該類含有抽象狀態聲明的變量,可引用具體的狀態實例,用戶對環境類的實例在某一些狀態的行為感興趣.
    2.抽象狀態,抽象狀態是一個接口名抽象類,抽象狀態中定義了與環境的一個特定狀態相關的若干方法.
    3.具體狀態,實現抽象接口
    各組成部份之間的關系:

    例子
    1.狀態:

    package state;

    /**
     * <ul>
     * <li>Title:[IState]</li>
     * <li>Description: [狀態接口]</li>
     * <li>Copyright 2009 Upengs Co., Ltd.</li>
     * <li>All right reserved.</li>
     * <li>Created by [Huyvanpull] [2011-8-2]</li>
     * <li>Midified by [modifier] [modified time]</li>
     * </ul>
     * 
    @version 1.0  
     
    */

    public interface IState
    {   
        
    /**
         * <ul>
         * <li>Description:[顯示狀態]</li>
         * <li>Created by [Huyvanpull] [2011-8-2]</li>
         * <li>Midified by [modifier] [modified time]</li>
         * </ul>
         
    */

        
    public void showState();
    }

    2.具體狀態1:

    package state;

    public class LowState implements IState
    {
        
    public void showState()
        
    {
            System.out.println(
    "低狀態");
        }
       
    }


    3.具體狀態2

    package state;

    public class NormalState implements IState
    {
        
    public void showState()
        
    {
            System.out.println(
    "正常狀態");
        }
       
    }

    4.具體狀態3

    package state;

    public class HeightState implements IState
    {
        
    public void showState()
        
    {
            System.out.println(
    "高狀態");
        }

    }

    5.環境

    package state;

    public class StateMometer
    {
        
    public IState state;
        
        
    public void showState()
        
    {
            state.showState();
        }


        
    public void setState(IState state)
        
    {
            
    this.state = state;
        }

    }

    6.測試

    package state;

    public class Test
    {   
        
    public static void main(String[] args)
        
    {
            IState state 
    = new LowState();
            
            StateMometer stateMoneter 
    = new StateMometer();
            stateMoneter.setState(state);
            stateMoneter.showState();
            
            state 
    = new NormalState();
            stateMoneter.setState(state);
            stateMoneter.showState();
            
            state 
    = new HeightState();
            stateMoneter.setState(state);
            stateMoneter.showState();
            
        }

    }

     

    要點:

    1. 策略模式和狀態模式是雙胞胎,它們有相同的類圖,但是它們的意圖不同。策略模式是圍繞可以互換的算法來成功創建業務的,然而狀態模式是通過改變對象內部的狀態來幫助對象控制自己的行為.

    2. Context將與狀態相關的操作委托給當前的Concrete State對象處理。

    3. Context可將自身作為一個參數傳遞給處理該請求的狀態對象。這使得狀態對象在必要時可訪問Context。

    4. Context或Concrete State類都可決定哪個狀態是另外哪一個的后繼者,以及是在何種條件下進行狀態轉換。也就是說可以在State中保存對Concrete State的引用,在必要時設置具體的狀態,做到狀態的轉換。

    5. 一般來講,當狀態轉換是固定的時候,狀態轉換就適合放在Context中。然而,當轉換是更動態的時候,通常會放到具體的狀態類中進行。(具體狀態類持有Context的引用,實現狀態的轉換)

     

    適用性:

    1. 一個對象的行為取決于它的狀態 , 并且它必須在運行時刻根據狀態改變它的行為。

    2. 一個操作中含有龐大的多分支的條件語句,且這些分支依賴于該對象的狀態。這個狀態通常用一個或多個枚舉常量表示。通常,有多個操作包含這一相同的條件結構。 State模式將每一個條件分支放入一獨立的類中。這使得你可以根據對象自身的情況將對象的狀態作為一個對象,這一對象可以不依賴于其他對象而獨立變化。

     

    效果:

    1. State模式將與特定狀態相關的行為局部化,并且將不同狀態的行為分割開來。

    State模式將所有與一個特定的狀態相關的行為都放入一個對象中。因為所有與狀態相關的代碼都存在于某一個State子類中, 所以通過定義新的子類可以很容易的增加新的狀態和轉換。

    另一個方法是使用數據值定義內部狀態并且讓Context操作來顯式地檢查這些數據。但這樣將會使整個Context的實現中遍布看起來很相似的條件語句或case語句。增加一個新的狀態可能需要改變若干個操作,這就使得維護變得復雜了。

    State模式避免了這個問題,但可能會引入另一個問題,因為該模式將不同狀態的行為分布在多個State子類中。這就增加了子類的數目,相對于單個類的實現來說不夠緊湊。但是如果有許多狀態時這樣的分布實際上更好一些 , 否則需要使用巨大的條件語句。正如很長的過程一樣,巨大的條件語句是不受歡迎的。它們形成一大整塊并且使得代碼不夠清晰,這又使得它們難以修改和擴展。 State模式提供了一個更好的方法來組織與特定狀態相關的代碼。決定狀態轉移的邏輯不在單塊的 if或switch語句中, 而是分布在State子類之間。將每一個狀態轉換和動作封裝到一個類中,就把著眼點從執行狀態提高到整個對象的狀態。這將使代碼結構化并使其意圖更加清晰。

    2. State對象可被共享。如果State對象沒有實例變量,即它們表示的狀態完全以它們的類型來編碼,那么各Context對象可以共享一個 State對象。






     

    posted on 2011-08-02 13:15 HUIKK 閱讀(247) 評論(0)  編輯  收藏 所屬分類: Design Patterns
    主站蜘蛛池模板: 狠狠躁狠狠爱免费视频无码| 国产精品亚洲精品爽爽| 中国videos性高清免费| av在线亚洲欧洲日产一区二区| 国产精品亚洲综合网站| 亚洲а∨天堂久久精品| 本道天堂成在人线av无码免费 | 一个人免费观看www视频在线| 亚洲影院在线观看| 99在线精品免费视频九九视| 亚洲中文字幕久在线| 三年片在线观看免费大全| 77777午夜亚洲| 日本牲交大片免费观看| 黄色免费网址在线观看| 国产亚洲精品激情都市| 三级网站在线免费观看| 久久久久亚洲精品无码蜜桃| 免费人成在线观看69式小视频| 亚洲日本国产乱码va在线观看| 欧美a级在线现免费观看| 美国毛片亚洲社区在线观看| 亚洲人成网站18禁止一区| 精品一卡2卡三卡4卡免费视频| 亚洲成AV人片久久| 国产成人精品免费视频大全五级 | 午夜在线亚洲男人午在线| 亚洲成a人片在线观看国产| 中文字幕不卡免费视频| 亚洲酒色1314狠狠做| 成人片黄网站A毛片免费| 日韩在线视频线视频免费网站| 国产成A人亚洲精V品无码| 免费黄色福利视频| 国产亚洲精品2021自在线| 亚洲色爱图小说专区| 成年女人男人免费视频播放| 精品97国产免费人成视频 | 亚洲狠狠婷婷综合久久| 亚洲乱码中文字幕久久孕妇黑人| 国产在线jyzzjyzz免费麻豆|