1、什麼是狀態模式設計模式
State模式也叫狀態模式,是行爲設計模式的 一種。State模式容許經過改變對象的內部狀態 而改變對象的行爲,這個對象表現得就好像修改 了它的類同樣。測試
2、狀態模式的應用場景this
狀態模式主要解決的是當控制一個對象狀態轉 換的條件表達式過於複雜時的狀況。把狀態的判 斷邏輯轉譯到表現不一樣狀態的一系列類當中,可 以把複雜的判斷邏輯簡化。spa
3、狀態模式的結構設計
4、狀態模式的角色和職責code
Context:用戶對象 擁有一個State類型的成員,以標識對象的當前 狀態;對象
State:接口或基類 封裝與Context的特定狀態相關的行爲;blog
ConcreteState:接口實現類或子類 實現了一個與Context某個狀態相關的行爲。接口
1 public class Person { 2 private int hour; 3 4 public int getHour() { 5 return hour; 6 } 7 8 public void setHour(int hour) { 9 this.hour = hour; 10 } 11 12 public void doSomething(){ 13 if(hour == 7) { 14 System.out.println("吃早餐"); 15 } else if(hour == 12) { 16 System.out.println("吃中飯"); 17 } else if(hour == 18) { 18 System.out.println("吃晚飯"); 19 } else { 20 System.out.println(hour + "未定義"); 21 } 22 } 23 }
1 public class MainClass { 2 public static void main(String[] args) { 3 Person person = new Person(); 4 5 person.setHour(7); 6 person.doSomething(); 7 8 person.setHour(12); 9 person.doSomething(); 10 11 person.setHour(18); 12 person.doSomething(); 13 14 person.setHour(8); 15 person.doSomething(); 16 } 17 }
=================================================================get
使用狀態模式
人
1 public class Person { 2 private int hour; 3 private State state; 4 5 public int getHour() { 6 return hour; 7 } 8 9 public void setHour(int hour) { 10 this.hour = hour; 11 } 12 13 public void doSomething(){ 14 if(hour == 7) { 15 state = new MState(); 16 state.doSomething(); 17 } else if(hour == 12) { 18 state = new LState(); 19 state.doSomething(); 20 } else if(hour == 18) { 21 state = new SState(); 22 state.doSomething(); 23 } else { 24 state = new NoState(); 25 state.doSomething(); 26 } 27 } 28 }
狀態 抽象
1 public abstract class State { 2 public abstract void doSomething(); 3 }
吃早餐
1 public class MState extends State { 2 3 public void doSomething() { 4 System.out.println("吃早餐"); 5 } 6 }
吃中午餐
1 public class LState extends State{ 2 3 public void doSomething() { 4 System.out.println("吃中飯"); 5 } 6 }
吃晚飯
1 public class SState extends State { 2 3 public void doSomething() { 4 System.out.println("吃晚飯"); 5 } 6 }
未定義
1 public class NoState extends State { 2 3 public void doSomething() { 4 System.out.println("未定義"); 5 } 6 }
測試
1 public class MainClass { 2 public static void main(String[] args) { 3 Person person = new Person(); 4 5 person.setHour(7); 6 person.doSomething(); 7 8 person.setHour(12); 9 person.doSomething(); 10 11 person.setHour(18); 12 person.doSomething(); 13 14 person.setHour(8); 15 person.doSomething(); 16 } 17 }