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

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

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

    samtiger


    QQ:418148757
    Name:yangchuan
    數據加載中……
    設計模式之狀態模式

            哎,最近一直在河北華為移動項目組做外包,一直也沒有機會寫什么代碼,也沒機會上網 ,真的是郁悶死了。
           
           我們在做某一些操作的時候,遇到不同狀態的時候就會有不同的處理方式。為了判別這些狀態,我們必然會使用大量的if else語句來做狀態判斷處理。而隨著if else(或switch case)語句的增多,程序的可讀性,擴展性也會變得很弱。維護也會很麻煩,你可能看到過有的代碼中 一個函數就有n多if語句,代碼甚至超過了上千行。
            舉一個例子:我們給一部手機打電話,就可能出現這幾種情況:用戶開機,用戶關機,用戶欠費停機,用戶消戶等。 所以當我們撥打這個號碼的時候:系統就要判斷,該用戶是否在開機且不忙狀態,又或者是關機,欠費等狀態。但不管是那種狀態我們都應給出對應的處理操作。下面我們用代碼來模擬一下這個過程。

     1/***********************************************************************
     2 * Module:  Context.java
     3 * Author:  yang00013
     4 * Purpose: Defines the Class Context
     5 ***********************************************************************/

     6
     7import java.util.*;
     8
     9
    10public class MobileTelephone{
    11   //開機且用戶沒使用的狀態
    12   private int waitState = 1;
    13   //關機狀態
    14   private int closeState = 2;
    15   //停機狀態
    16   private int stopState = 3;
    17  // 已消戶
    18   private int logoutState = 4;
    19  // 撥通
    20  private int connectState = 5;
    21   //當前狀態
    22   private int state = openState;   
    23   
    24  
    25   //打電話操作
    26   public void call() {
    27     if (state == waitState )
    28     {
    29        system.out.println("連接成功,可以通話");
    30        //改變狀態為連接通話狀態
    31        changeState(connectState);            
    32     }
    else if(state == closeState )
    33       {
    34            system.out.println("用戶已關機");
    35       }
    else if(state == stopState){
    36            system.out.println("用戶欠費停機");
    37       }
    else if (state == connectState){
    38            system.out.println("用戶正在通話,請稍后再撥!"); 
    39     }

    40
    41   }
       
    42   
    43   //通話計時
    44   public void countTime(){
    45     if (state == connectState )
    46     {
    47        system.out.println("計時處理。。。");
    48        system.out.println("通話結束,計時結束");
    49        changeState(waitState);            
    50     }
    else if(state = waitState){
    51        system.out.println("電話不在連接狀態,不計時。。。");
    52     }
    else if(state == closeState )
    53       {
    54            system.out.println("用戶已關機");
    55       }
    else if(state == stopState){
    56            system.out.println("用戶欠費停機");
    57       }

    58
    59  }

    60  
    61    //其他操作:比如開機,關機,欠費開機等操作與上雷同,在此省略。。。
    62 
    63
    64   public void changeState(int concreteState) {
    65      this.state = concreteState;
    66   }

    67
    68}

             注意,看看上面的代碼,顯然它已經完成了我們的基本業務操作,但是,一旦我們有新的狀態加入的話,我們勢必要在每個業務方法里邊增加相應的else if語句。所以加入x個狀態就有可能加入n*x條else if語句,n表示函數(業務方法)的數量。

    狀態模式:把不同狀態的操作分散到不同的狀態對象里去完成。看看狀態類的uml類圖。
        

           從上圖可以看出,每一個狀態類都會去處理所有的業務方法,根據他自身的狀態,去讓不同函數(業務方法)作相應的不同處理。而我們先前的方式是,在不同的函數(業務方法)里去判斷不同狀態,然后分別對每一個狀態作不同的處理。很顯然,我們采用狀態模式的方式在后續擴張和維護能力上都得到了很大程度提高,比如我們先加入一個狀態,我就只僅僅需要加入一個相應的狀態類就可以了。代碼量也就是實現該狀態下各個函數的不同處理過程而已。好,看看實現代碼:

     1/***********************************************************************
     2 * Module:  IState.java
     3 * Author:  yang00013
     4 * Purpose: Defines the Interface IState
     5 ***********************************************************************/

     6
     7import java.util.*;
     8
     9
    10public interface IState {
    11   
    12   void call();
    13   
    14   void countTimes();
    15   
    16  // 其他操作。
    17
    18}
     空閑狀態:
     1/***********************************************************************
     2 * Module:  ConcreteStateA.java
     3 * Author:  yang00013
     4 * Purpose: Defines the Class ConcreteStateA
     5 ***********************************************************************/

     6
     7import java.util.*;
     8
     9
    10public class WaitState implements IState {
    11   
    12   private Context context;   
    13   
    14   public void call() {
    15       //做連接操作
    16        system.out.println("連接成功,可以通話");
    17        //改變狀態為連接通話狀態
    18        context。changeState(context.getConnectState());         
    19   }

    20   
    21   
    22   public void countTimes() {
    23       system.out.print("電話不在連接狀態,不能計時");
    24   }

    25   
    26   
    27  
    28
    29}
    通話狀態:
     1/***********************************************************************
     2 * Module:  ConcreteStateB.java
     3 * Author:  yang00013
     4 * Purpose: Defines the Class ConcreteStateB
     5 ***********************************************************************/

     6
     7import java.util.*;
     8
     9
    10public class ConnectState implements IState {
    11
    12   private Context context;
    13   
    14   
    15   public void call() {
    16      system.out.print("用戶正在通話,請稍后再撥");
    17   }

    18   
    19
    20   public void countTimes() {
    21      system.out.println("計時處理。。。");
    22      system.out.println("通話結束,計時結束");
    23      context.changeState(context.getWaitState());    
    24   }

    25   
    26  
    27   
    28}
    新的手機類
     1/***********************************************************************
     2 * Module:  Context.java
     3 * Author:  yang00013
     4 * Purpose: Defines the Class Context
     5 ***********************************************************************/

     6
     7import java.util.*;
     8
     9
    10public class MobileTelephone {
    11   //開機且空閑狀態
    12   private State waitState = new waitState();
    13   //通話連接狀態
    14   private State connectState = new ConnectState();
    15   //關機狀態
    16   private State stopState = new stopState();
    17  //其它狀態與上了雷同,在此省略。。。
    18   //當前狀態
    19   private State state = waitState;   
    20   
    21   //撥打操作
    22   public void call() {
    23      state.call(); 
    24   }
       
    25  //計時操作
    26   public void countTimes() {
    27     state.countTimes();
    28   }
       
    29  
    30  
    31   
    32   public void chageState(State concreteState) {
    33      this.state = concreteState;
    34   }

    35
    36
    37   //setter/getter 方法列表
    38   
    39}
           狀態模式和策略模式的最大區別在于它有狀態間的切換,一個狀態完了,就要切換到它下一個狀態。

    posted on 2008-03-14 13:51 sam.chuan.yang 閱讀(5898) 評論(2)  編輯  收藏 所屬分類: 23設計模式的理解

    評論

    # re: 設計模式之狀態模式[未登錄] 2010-01-26 09:37 Yang

    首先感謝博主的描述,我覺得是網上比較好的對狀態模式的闡述,不過那個UML圖的菱形顏色貌似錯了,使用的是組合,顏色應該是白色吧?黑色是聚合,生命周期不同。不過圖畫的很好。
      回復  更多評論    

    # re: 設計模式之狀態模式 2010-01-26 18:33 sam.chuan.yang

    例子用的是組合,圖也沒有錯,當然這種對狀態類的依耐性比較強,其實可以用聚合關系,比如用依賴注入的方式將實際狀態對象注入進來,而不是自己new一個,感謝你的關注,不當之處,請多多多交流。謝謝
      回復  更多評論    

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


    網站導航:
     
    主站蜘蛛池模板: 在线日本高清免费不卡| 激情内射亚洲一区二区三区| 国产2021精品视频免费播放| 一个人免费观看日本www视频 | 美女又黄又免费的视频| 亚洲va精品中文字幕| 亚洲av午夜成人片精品网站| 亚洲综合色视频在线观看| 国产精品无码一二区免费| 日本一区二区三区免费高清| 欧洲精品99毛片免费高清观看| 国产精品九九久久免费视频 | 成人毛片18女人毛片免费 | 亚洲精品无码久久毛片波多野吉衣| 久久精品国产亚洲精品| 免费国产精品视频| 男女交性永久免费视频播放| 色婷婷7777免费视频在线观看 | 91亚洲自偷在线观看国产馆| 亚洲国产综合专区电影在线| 亚洲高清国产拍精品26U| 亚洲中文字幕在线第六区| 狠狠色婷婷狠狠狠亚洲综合| 亚洲精品一级无码鲁丝片| mm1313亚洲精品无码又大又粗| 国产成人免费一区二区三区| 在线观看免费为成年视频| 成人免费午间影院在线观看| 妞干网免费视频在线观看| 日韩免费视频播放| 日本免费人成黄页在线观看视频| 四虎影视免费在线| 免费乱理伦在线播放| 亚洲精品视频在线看| 亚洲人成国产精品无码| 国产亚洲精久久久久久无码77777 国产亚洲精品成人AA片新蒲金 | 女人张开腿等男人桶免费视频| 精品国产免费观看一区| 免费鲁丝片一级观看| 日本一区二区三区日本免费| 免费h成人黄漫画嘿咻破解版|