java設計模式之狀態模式


狀態模式

    允許一個對象在其內部狀態改變時改變它的行為,對象看起來似乎修改了它的類。

狀態模式UML圖

  上下文環境(Context):它定義了客戶程序需要的接口並維護一個具體狀態角色的實例,將與狀態相關的操作委托給當前的Concrete State對象來處理。

  抽象狀態(State):定義一個接口以封裝使用上下文環境的的一個特定狀態相關的行為。

  具體狀態(Concrete State):實現抽象狀態定義的接口。

狀態模式代碼

package com.roc.state;

public class Context {

    private State state;
    
    public Context(State state){
        this.state=state;
    }

    public State getState() {
        return state;
    }

    public void setState(State state) {
        this.state = state;
    }
    
    public void stateChange(){
        state.action(this);
    }
    
}
package com.roc.state;
/**
 * 抽象狀態類
 * @author liaowp
 *
 */
public abstract class State {
    public abstract void action(Context context);
}
package com.roc.state;

public class OpenSate extends State{

    public void action(Context context) {
        System.out.println("開");
        context.setState(new CloseState());
    }

}
package com.roc.state;

public class CloseState extends State{

    public void action(Context context) {
        System.out.println("關");
        context.setState(new OpenSate());
    }

}
package com.roc.state;
/**
 * 狀態模式
 * @author liaowp
 *
 */
public class Client {
    public static void main(String[] args) {
        Context context=new Context(new CloseState());
        context.stateChange();
        context.stateChange();
        context.stateChange();
        context.stateChange();
        context.stateChange();
        context.stateChange();
        context.stateChange();
        context.stateChange();
    }
}

狀態模式適用場景

   狀態模式將與特定狀態相關的行為局部化,並且將不同狀態的行為分割開來。

   所有狀態相關的代碼都存在於某個ConcereteState中,所以通過定義新的子類很容易地增加新的狀態和轉換。

   狀態模式通過把各種狀態轉移邏輯分不到State的子類之間,來減少相互間的依賴。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM