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

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

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

    設計模式學習筆記(十五)—State模式

    Posted on 2007-12-05 16:35 flustar 閱讀(1603) 評論(1)  編輯  收藏 所屬分類: Design Patterns

    一、 State模式定義:
    允許一個對象在其狀態改變時,改變它的行為。看起來對象似乎修改了它的類。
    二、 模式解說
    State模式主要解決的是在開發中時常遇到的根據不同的狀態需要進行不同的處理操作的問題,而這樣的問題,大部分人是采用switch-case語句進行處理的,這樣會造成一個問題:分支過多,而且如果加入一個新的狀態就需要對原來的代碼進行編譯。State模式采用了對這些不同的狀態進行封裝的方式處理這類問題,當狀態改變的時候進行處理然后再切換到另一種狀態,也就是說把狀態的切換責任交給了具體的狀態類去負責.同時,State模式和Strategy模式有很多相似的地方,需要說明的是兩者的思想都是一致的,只不過封裝的東西不同:State模式封裝的是不同的狀態,而Stategy模式封裝的是不同的算法。
    三、 結構圖
    State模式結構圖如下:
     
    四、 怎么使用?
    1) 定義一個State接口,接口中有一個統一的方法,用以封裝一個特定狀態所對應的行為。
    2) 定義具體不同狀態類ConcreteSate實現State接口。
    3) 每一個狀態類都實現環境(Context)一個狀態所對應的行為。
    4) 定義一個狀態管理器Context.
    五、 一個例子
    interface State{
     public void handle(Context ctx);
    }
    class ConcreteStateA implements State{

     public void handle(Context ctx) {
      System.out.println("handle by ConcreteStateA");
      if(ctx!=null){
       ctx.ChangeState(new ConcreteStateB());
      }
      
     }
     
    }
    class ConcreteStateB implements State{

     public void handle(Context ctx) {
      System.out.println("handle by ConcreteStateB");
      if(ctx!=null){
       ctx.ChangeState(new ConcreteStateA());
      }
      
     }
     
    }
    class Context{
     private State _state;
     public Context(State state){
      _state=state;
     }
     
     public void request(){
      if(_state!=null){
       _state.handle(this);
      }
     }
     public void ChangeState(State s){
      if(_state!=null){
       _state=null;
      }
      _state=s;
     }
    }
    public class StateClient {

     public static void main(String[] args) {
      State state=new ConcreteStateA();
      Context context=new Context(state);
      context.request();
      context.request();
      context.request();
      context.request();

     }

    }
    輸出結果:
    handle by ConcreteStateA
    handle by ConcreteStateB
    handle by ConcreteStateA
    handle by ConcreteStateB

    每請求一次,狀態就更換一次,就執行對應的行為。

    六、 適用性
    1) 一個對象的行為取決于它的狀態,并且它必須在運行時刻根據狀態改變它的行為。
    2) 一個對象含有龐大的條件分支語句,這些分支依賴于它的狀態。這個狀態通常用一個或多個枚舉常量表示。通常有多個操作包含這一相同的結構。State模式將每一個分支放入一個獨立的類中。這使得你可以根據對象自身的情況將對象的狀態作為一個對象,這一對象可以不依賴于其他對象而獨立變化。
    七、 優缺點
    1) 優點: 避免了為判斷狀態而產生的巨大的if或case語句。 將對象行為交給狀態類維護后,對于上層程序而言,僅需要維護狀態之間的轉換規則。
    2) 會導致某些系統有過多的具體狀態類。
    八、 參考
    http://www.cppblog.com/converse/archive/2006/08/07/10902.html
    http://www.tkk7.com/flying/archive/2006/08/29/66472.html


     

    Feedback

    # re: 設計模式學習筆記(十五)—State模式  回復  更多評論   

    2010-03-22 12:44 by Wondering
    Agree

    posts - 146, comments - 143, trackbacks - 0, articles - 0

    Copyright © flustar

    主站蜘蛛池模板: 韩国18福利视频免费观看| 国产亚洲精品a在线观看| 国产成人高清亚洲一区91| 国产成人亚洲精品影院| 久久国产高潮流白浆免费观看| 亚洲日韩精品国产一区二区三区| 亚洲性日韩精品一区二区三区| 99国产精品免费视频观看| 久久精品国产亚洲av天美18| 亚洲线精品一区二区三区影音先锋 | 亚洲中文字幕久久精品无码喷水| 99re视频精品全部免费| 色视频在线观看免费| 亚洲精品乱码久久久久久下载 | 色婷婷7777免费视频在线观看| 成人片黄网站A毛片免费| 一级黄色毛片免费看| 亚洲午夜精品一区二区公牛电影院| 亚洲精品国产精品乱码不卞 | 暖暖日本免费中文字幕| 国产精品久久久久久亚洲影视 | 亚洲一级特黄特黄的大片| 亚洲综合伊人久久综合| 日韩毛片免费在线观看| 日本免费一区二区三区四区五六区 | 亚洲色大成网站www永久一区| 成人免费视频软件网站| 99久久综合精品免费| 和老外3p爽粗大免费视频| 亚洲JLZZJLZZ少妇| 亚洲国产综合在线| 亚洲av无码无在线观看红杏| 亚洲精品视频久久久| 日本免费人成视频播放| 91麻豆最新在线人成免费观看| 国产情侣久久久久aⅴ免费| 免费人妻精品一区二区三区| 亚洲日本va一区二区三区| 亚洲一区二区三区免费在线观看| 亚洲成熟xxxxx电影| 亚洲线精品一区二区三区|