夢(mèng)幻之旅

          DEBUG - 天道酬勤

             :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            671 隨筆 :: 6 文章 :: 256 評(píng)論 :: 0 Trackbacks

          狀態(tài)模式

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

          例子
          1.狀態(tài):

          package state;

          /**
           * <ul>
           * <li>Title:[IState]</li>
           * <li>Description: [狀態(tài)接口]</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:[顯示狀態(tài)]</li>
               * <li>Created by [Huyvanpull] [2011-8-2]</li>
               * <li>Midified by [modifier] [modified time]</li>
               * </ul>
               
          */

              
          public void showState();
          }

          2.具體狀態(tài)1:

          package state;

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


          3.具體狀態(tài)2

          package state;

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

          4.具體狀態(tài)3

          package state;

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

          }

          5.環(huán)境

          package state;

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


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

          }

          6.測(cè)試

          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();
                  
              }

          }

           

          要點(diǎn):

          1. 策略模式和狀態(tài)模式是雙胞胎,它們有相同的類圖,但是它們的意圖不同。策略模式是圍繞可以互換的算法來(lái)成功創(chuàng)建業(yè)務(wù)的,然而狀態(tài)模式是通過(guò)改變對(duì)象內(nèi)部的狀態(tài)來(lái)幫助對(duì)象控制自己的行為.

          2. Context將與狀態(tài)相關(guān)的操作委托給當(dāng)前的Concrete State對(duì)象處理。

          3. Context可將自身作為一個(gè)參數(shù)傳遞給處理該請(qǐng)求的狀態(tài)對(duì)象。這使得狀態(tài)對(duì)象在必要時(shí)可訪問(wèn)Context。

          4. Context或Concrete State類都可決定哪個(gè)狀態(tài)是另外哪一個(gè)的后繼者,以及是在何種條件下進(jìn)行狀態(tài)轉(zhuǎn)換。也就是說(shuō)可以在State中保存對(duì)Concrete State的引用,在必要時(shí)設(shè)置具體的狀態(tài),做到狀態(tài)的轉(zhuǎn)換。

          5. 一般來(lái)講,當(dāng)狀態(tài)轉(zhuǎn)換是固定的時(shí)候,狀態(tài)轉(zhuǎn)換就適合放在Context中。然而,當(dāng)轉(zhuǎn)換是更動(dòng)態(tài)的時(shí)候,通常會(huì)放到具體的狀態(tài)類中進(jìn)行。(具體狀態(tài)類持有Context的引用,實(shí)現(xiàn)狀態(tài)的轉(zhuǎn)換)

           

          適用性:

          1. 一個(gè)對(duì)象的行為取決于它的狀態(tài) , 并且它必須在運(yùn)行時(shí)刻根據(jù)狀態(tài)改變它的行為。

          2. 一個(gè)操作中含有龐大的多分支的條件語(yǔ)句,且這些分支依賴于該對(duì)象的狀態(tài)。這個(gè)狀態(tài)通常用一個(gè)或多個(gè)枚舉常量表示。通常,有多個(gè)操作包含這一相同的條件結(jié)構(gòu)。 State模式將每一個(gè)條件分支放入一獨(dú)立的類中。這使得你可以根據(jù)對(duì)象自身的情況將對(duì)象的狀態(tài)作為一個(gè)對(duì)象,這一對(duì)象可以不依賴于其他對(duì)象而獨(dú)立變化。

           

          效果:

          1. State模式將與特定狀態(tài)相關(guān)的行為局部化,并且將不同狀態(tài)的行為分割開來(lái)。

          State模式將所有與一個(gè)特定的狀態(tài)相關(guān)的行為都放入一個(gè)對(duì)象中。因?yàn)樗信c狀態(tài)相關(guān)的代碼都存在于某一個(gè)State子類中, 所以通過(guò)定義新的子類可以很容易的增加新的狀態(tài)和轉(zhuǎn)換。

          另一個(gè)方法是使用數(shù)據(jù)值定義內(nèi)部狀態(tài)并且讓Context操作來(lái)顯式地檢查這些數(shù)據(jù)。但這樣將會(huì)使整個(gè)Context的實(shí)現(xiàn)中遍布看起來(lái)很相似的條件語(yǔ)句或case語(yǔ)句。增加一個(gè)新的狀態(tài)可能需要改變?nèi)舾蓚€(gè)操作,這就使得維護(hù)變得復(fù)雜了。

          State模式避免了這個(gè)問(wèn)題,但可能會(huì)引入另一個(gè)問(wèn)題,因?yàn)樵撃J綄⒉煌瑺顟B(tài)的行為分布在多個(gè)State子類中。這就增加了子類的數(shù)目,相對(duì)于單個(gè)類的實(shí)現(xiàn)來(lái)說(shuō)不夠緊湊。但是如果有許多狀態(tài)時(shí)這樣的分布實(shí)際上更好一些 , 否則需要使用巨大的條件語(yǔ)句。正如很長(zhǎng)的過(guò)程一樣,巨大的條件語(yǔ)句是不受歡迎的。它們形成一大整塊并且使得代碼不夠清晰,這又使得它們難以修改和擴(kuò)展。 State模式提供了一個(gè)更好的方法來(lái)組織與特定狀態(tài)相關(guān)的代碼。決定狀態(tài)轉(zhuǎn)移的邏輯不在單塊的 if或switch語(yǔ)句中, 而是分布在State子類之間。將每一個(gè)狀態(tài)轉(zhuǎn)換和動(dòng)作封裝到一個(gè)類中,就把著眼點(diǎn)從執(zhí)行狀態(tài)提高到整個(gè)對(duì)象的狀態(tài)。這將使代碼結(jié)構(gòu)化并使其意圖更加清晰。

          2. State對(duì)象可被共享。如果State對(duì)象沒(méi)有實(shí)例變量,即它們表示的狀態(tài)完全以它們的類型來(lái)編碼,那么各Context對(duì)象可以共享一個(gè) State對(duì)象。






           

          posted on 2011-08-02 13:15 HUIKK 閱讀(248) 評(píng)論(0)  編輯  收藏 所屬分類: Design Patterns
          主站蜘蛛池模板: 确山县| 巴青县| 吉水县| 兴义市| 竹溪县| 澄城县| 聂拉木县| 南和县| 德化县| 马边| 沂源县| 彩票| 太康县| 八宿县| 巨鹿县| 滕州市| 晋州市| 云浮市| 潜江市| 泸水县| 塔城市| 清涧县| 临夏县| 改则县| 厦门市| 泌阳县| 方山县| 麻阳| 米易县| 汨罗市| 墨江| 钦州市| 鄂伦春自治旗| 黔西| 呈贡县| 邵阳市| 桑日县| 万源市| 博罗县| 东阳市| 沐川县|