狀態模式

一. 定義:

    狀態模式:當一個對象內在狀態改變時,允許其改變行爲,這個對象看起來像改變了其類

    抽象狀態角色(State):接口或抽象類,負責對象狀態定義,並封裝環境角色以實現狀態切換

    環境角色(Context):定義客戶端需要的接口,並負責具體狀態的切換

    具體狀態角色(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)把狀態對象聲明爲靜態常量,有幾個狀態對象就聲明幾個靜態常量。

        (2)環境角色具有狀態抽象角色定義的所有行爲,具體執行使用委託方式。

二. 狀態模式優缺點:

    狀態模式優點:

        -- 結構清晰,避免過多的if-else;

        -- 遵循開閉原則和單一原則;

        -- 封裝性好。

    狀態模式缺點:類膨脹。

三. 狀態模式的使用場景及注意事項

    1.使用場景:

        行爲隨狀態改變而改變的場景

        條件、分支判斷語句的替代者

    2.注意事項:

        行爲受狀態約束的情況下可以使用狀態模式,而且使用時對象的狀態最好不要超過5個。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章