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); } } } 缺點也顯而易見了,若是狀態太多了,對應的狀態類也會比較多的。。