一. 定義:
java
狀態模式:當一個對象內在狀態改變時,容許其改變行爲,這個對象看起來像改變了其類ide
抽象狀態角色(State):接口或抽象類,負責對象狀態定義,並封裝環境角色以實現狀態切換this
環境角色(Context):定義客戶端須要的接口,並負責具體狀態的切換spa
具體狀態角色(ConcreteState):每個具體狀態必須完成兩個職責:本狀態的行爲管理以及趨向狀態處理,即本狀態下要作的事情,以及本狀態如何過渡到其餘狀態對象
//抽象狀態角色:接口或抽象類,負責對象狀態定義,並封裝環境角色以實現狀態切換 public abstract class State { /** * 定義一個環境角色,就是封裝狀態的變化引發的功能變化,提供子類訪問 */ protected Context context; public void setContext(Context context) { this.context = context; } //行爲1 public abstract void handle1(); //行爲2 public abstract void handle2(); }
//具體狀態角色1 public class ConcreteState1 extends State{ @Override public void handle1() { //本狀態下必須處理的邏輯 } @Override public void handle2() { //設置當前狀態爲state2 super.context.setCurrentState(Context.STATE2); //過渡到state2狀態,由Context實現 super.context.handle2(); } }
//具體狀態角色2 public class ConcreteState2 extends State{ @Override public void handle1() { //設置當前狀態爲state1 super.context.setCurrentState(Context.STATE1); //過渡到state1狀態,由Context實現 super.context.handle1(); } @Override public void handle2() { //本狀態下必須處理的邏輯 }
////環境角色 public class Context { //定義狀態 public final static State STATE1 = new ConcreteState1(); public final static State STATE2 = new ConcreteState2(); //當前狀態 private State currentState; //得到當前狀態 public State getCurrentState() { return currentState; } //設置當前狀態 public void setCurrentState(State currentState) { this.currentState = currentState; //切換狀態 this.currentState.setContext(this); } //行爲委託 public void handle1() { this.currentState.handle1(); } public void handle2() { this.currentState.handle2(); } }
public class Client { /** * 狀態模式:當一個對象內在狀態改變時,容許其改變行爲,這個對象看起來像改變了其類 * @param args */ public static void main(String[] args) { //定義環境角色 Context context = new Context(); //初始化狀態 context.setCurrentState(new ConcreteState1()); //行爲執行 context.handle1(); context.handle2(); } }
環境角色約束:接口
(1)把狀態對象聲明爲靜態常量,有幾個狀態對象就聲明幾個靜態常量。get
(2)環境角色具備狀態抽象角色定義的全部行爲,具體執行使用委託方式。it
二. 狀態模式優缺點:class
狀態模式優勢:im
-- 結構清晰,避免過多的if-else;
-- 遵循開閉原則和單一原則;
-- 封裝性好。
狀態模式缺點:類膨脹。
三. 狀態模式的使用場景及注意事項
1.使用場景:
行爲隨狀態改變而改變的場景
條件、分支判斷語句的替代者
2.注意事項:
行爲受狀態約束的狀況下能夠使用狀態模式,並且使用時對象的狀態最好不要超過5個。