state狀態設計模式

state定義 
    不一樣的狀態,不一樣的行爲;或者說,每一個狀態有着相應的行爲. 
    
    就像電風扇的開關,一檔的上一個是關閉,關閉的上一個是五檔,五檔的上一個是四檔,以此類推,並且五檔的下一個是關閉,關閉的下一個是一檔。那麼在實際應用中,咱們可能會這樣作: 
     在上一檔的方法中: 
Java代碼  收藏代碼
if(level == 5){  
    level = 4;  
do something();  
}else if(level == 4){  
    level = 3;  
do something();  
  
} else if (level == 3){  
    level == 2;  
do something();  
  
}  


    在下一檔的方法中: 
Java代碼  收藏代碼
if(level == 1){  
    level = 2;  
do something();  
  
}else if(level == 2){  
    level = 3;  
do something();  
  
} else if (level == 3){  
    level == 4;  
do something();  
  
}  


    單一方向的切換還好點,雙方向的切換就能夠考慮使用state模式了 

     假設如今有一個開關,控制三種顏色的切換,blue,green,red,藍色下一個綠色,綠色下一個紅色,紅色下一個是藍色,也能夠倒過來 

代碼以下: 
Java代碼  收藏代碼
package state;  
  
/* 
 * 狀態操做接口,執行上一個下一個的操做,還能夠得到當前的狀態 
 * 固然在這能夠既執行別的操做,好比開關撥到某個顏色的時候,顏色對應的燈亮 
 */  
  
public interface State {  
  
    public  void last(Context c);  
  
    public  void next(Context c);  
      
    public  String getState();  
  
  
}  


Java代碼  收藏代碼
package state;  
  
/* 
 * 藍色狀態類,實現的接口的方法,經過狀態管理器在上一個或者下一個方法中 
 * 設置改變後的狀態 
 */  
public class BlueState implements State {  
  
    public String getState() {  
        // TODO Auto-generated method stub  
        return "blue";  
    }  
  
    public void last(Context c) {  
        c.setState(new GreenState());  
  
    }  
  
    public void next(Context c) {  
        c.setState(new RedState());  
  
    }  
  
}  


Java代碼  收藏代碼
package state;  
  
/* 
 * 綠色狀態類,實現的接口的方法,經過狀態管理器在上一個或者下一個方法中 
 * 設置改變後的狀態 
 */  
public class GreenState implements State {  
  
    public String getState() {  
          
        return "green";  
    }  
  
    public void last(Context c) {  
        c.setState(new RedState());  
  
    }  
  
    public void next(Context c) {  
    c.setState(new BlueState());  
  
    }  
  
}  


Java代碼  收藏代碼
 package state;  
/* 
 * 紅色狀態類,實現的接口的方法,經過狀態管理器在上一個或者下一個方法中 
 * 設置改變後的狀態 
 */  
 public class RedState implements State {  
  
public String getState() {  
    return "red";  
}  
  
public void last(Context c) {  
c.setState(new BlueState());  
  
}  
  
public void next(Context c) {  
    c.setState(new GreenState());  
  
}  


Java代碼  收藏代碼
package state;  
  
/* 
 * 狀態管理器,設置初始狀態,獲得當前狀態, 
 * 提供了兩個操做,上一個的操做方法中,調用了當前狀態的last方法,將狀態管理器的狀態更新 
 *                下一個的操做方法中,調用了當前狀態的next方法,將狀態管理器的狀態更新 
 */  
public class Context {  
      
    private State state = null;  
  
    public State getState() {  
        return state;  
    }  
  
    public void setState(State state) {  
        this.state = state;  
    }  
      
    public void push(){  
          
        state.last(this);  
        System.out.println(state.getState());  
    }  
      
    public void pull(){  
          
        state.next(this);  
        System.out.println(state.getState());  
    }  
      
  
}  


Java代碼  收藏代碼
package state;  
/* 
 * 測試類 
 */  
public class Test {  
  
    public static void main(String[] args) throws InterruptedException {  
        /* 
         * 建立一個狀態管理器,設置初始狀態爲紅色, 
         * 而後就能夠執行狀態管理器的last或者next方法 
         */  
        Context c = new Context();  
        State redsState = new RedState();         
        c.setState(redsState);  
            while (true){  
                System.out.println("當前狀態:"+c.getState().getState());  
                System.out.print("上一個狀態: ");  
                 c.push();  
                 Thread.currentThread().sleep(2000);  
            }          
    }  
      
}  



 

    缺點也顯而易見了,若是狀態太多了,對應的狀態類也會比較多的。。
相關文章
相關標籤/搜索