設計模式之狀態模式

     狀態模式,顧名思義,行爲是由狀態來決定的,不同的狀態下有不同的行爲,比如說電視機,當我們按開機鍵後,頻道+,-,音量+、-都可以使用,而當我們按關機鍵之後除了開機鍵其他鍵都不可以使用。這就是一種狀態

     沒圖我說個JB...
     

角色介紹:
               Context 環境類,定義客戶感興趣的接口,維護一個State子類的示例,這個實例定義了對象的當前狀態;
               State 抽象狀態類或者狀態接口,定義一個或者一組接口,表示該狀態下的行爲。
               ConcreteStateA,ConcreteStateB 具體狀態類,每一個具體的狀態類實現抽象State中定義的接口,從而達到不同狀態下的不同行爲


就上面的那個例子,如果不按照狀態模式寫的話就是這樣的

package Client;

/**
 * 不按照狀態模式寫
 * 電視遙控器、含有開機、關機、下一頻道、上一頻道、調高音量、調低音量、這幾個功能
 * */
public class TvController {
       //開機狀態
       private final static int POWER_ON=1;
       //關機狀態
       private final static int POWER_OFF=2;
       private int mState =POWER_OFF;
      
       public void powerOn(){
             mState=POWER_ON ;
             if(mState ==POWER_OFF){
                  System. out.println("開機了!" );
            }
      }
      
       public void PowerOff(){
             mState=POWER_OFF ;
             if(mState ==POWER_ON){
                  System. out.println("關機了 !" );
            }
      }
      
       public void nextChannel(){
             if(mState ==POWER_ON){
                  System. out.println("已經切換下一頻道" );
            } else{
                  System. out.println("未開機" );
            }
      }
      
       public void prevChannel(){
             if(mState ==POWER_ON){
                  System. out.println("已經切換上一頻道" );
            } else{
                  System. out.println("未開機" );
            }
      }
      
       public void turnUp(){
             if(mState ==POWER_ON){
                  System. out.println("已經調高音量" );
            } else{
                  System. out.println("未開機" );
            }
      }
      
       public void turnDowm(){
             if(mState ==POWER_ON){
                  System. out.println("已經調低音量" );
            } else{
                  System. out.println("未開機" );
            }
      }
}

這樣寫的話可以看到有太多的if else來進行判斷,而且修改的時候比較麻煩,利用狀態模式的話是下面這樣的

首先定義一個電視的狀態接口,定義電視的操作函數

package State;
/**
 * 電視狀態接口,定義了電視操作的函數
 * */
public interface   TvSAtate {
       public void nextChannel();
       public void prevChannel();
       public void turnUp();
       public void turnDown();
}

然後實現兩個狀態的操作,開機狀態的操作和關機狀態的操作:

package State;

/**
 * 關機狀態,此時只有開機功能是有效的
 * **/
public class PowerOffState implements TvSAtate{

       @Override
       public void nextChannel() {
             // TODO Auto-generated method stub
            
      }

       @Override
       public void prevChannel() {
             // TODO Auto-generated method stub
            
      }

       @Override
       public void turnUp() {
             // TODO Auto-generated method stub
            
      }

       @Override
       public void turnDown() {
             // TODO Auto-generated method stub
            
      }

}

開機狀態
package State;

/**
 * 開機狀態
 * */
public class PowerOnState implements TvSAtate{

       @Override
       public void nextChannel() {
             // TODO Auto-generated method stub
            System. out.println("下一頻道" );
      }

       @Override
       public void prevChannel() {
             // TODO Auto-generated method stub
            System. out.println("上一頻道" );
      }

       @Override
       public void turnUp() {
             // TODO Auto-generated method stub
            System. out.println("調高音量" );
      }

       @Override
       public void turnDown() {
             // TODO Auto-generated method stub
            System. out.println("調低音量" );
      }

}

定義一個電源操作接口
package Controller;

/**
 * 電源操作接口
 * */
public interface PowerController {
     public void powerOn();
     public void powerOff();
}

然後是他的實現
/**
 * 狀態模式下的遙控器
 * **/
public class TvControllerToStae  implements PowerController{
      TvSAtate mState;
      
       public  void setTvState(TvSAtate sAtate){
             this.mState =sAtate ;
      }
      
       @Override
       public void powerOn() {
             // TODO Auto-generated method stub
            setTvState( new PowerOnState());
            System. out.println("已經開機" );
      }

       @Override
       public void powerOff() {
             // TODO Auto-generated method stub
            setTvState( new PowerOffState());
            System. out.println("已經關機" );
      }
      
       public void nextChannel(){
             mState.nextChannel();
      }
      
       public void prevChannel(){
             mState.prevChannel();
      }
      
       public void turnUp(){
             mState.turnUp();
      }
      
       public void turnDowm(){
             mState.turnDown();
      }

}

然後是運行

package Client;

public class Clien {
      
       public static void main(String[] args) {
            TvControllerToStae tvControllerToStae=new TvControllerToStae();
            
             //開機之後的操作
             tvControllerToStae.powerOn();
             tvControllerToStae.prevChannel();
             tvControllerToStae.turnUp();
             tvControllerToStae.turnDowm();
             tvControllerToStae.nextChannel();
            
            System. out.println("------我是一個漂亮的分割線------" );
             //關機之後的操作
             tvControllerToStae.powerOff();
             tvControllerToStae.prevChannel();
             tvControllerToStae.turnUp();
             tvControllerToStae.turnDowm();
             tvControllerToStae.nextChannel();
      }

}



在安卓中,狀態模式比較典型的就是WIFI的管理

發佈了58 篇原創文章 · 獲贊 20 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章