狀態模式

一. 定義:
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個。

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息