天天看點

設計模式-狀态模式

狀态模式 參考

  狀态模式,又稱狀态對象模式(Pattern of Objects for States),狀态模式是對象的行為模式。狀态模式允許一個對象在其内部狀态改變的時候改變其行為。這個對象看上去就像是改變了它的類一樣。

狀态模式的結構

   用一句話來表述,狀态模式把所研究的對象的行為包裝在不同的狀态對象裡,每一個狀态對象都屬于一個抽象狀态類的一個子類。狀态模式的意圖是讓一個對象在其内部狀态改變的時候,其行為也随之改變。狀态模式的示意性類圖如下所示:

  狀态模式所涉及到的角色有:

  •  環境(Context)角色,也成上下文:定義用戶端所感興趣的接口,并且保留一個具體狀态類的執行個體。這個具體狀态類的執行個體給出此環境對象的現有狀态。
  • 抽象狀态(State)角色:定義一個接口,用以封裝環境(Context)對象的一個特定的狀态所對應的行為。
  • 具體狀态(ConcreteState)角色:每一個具體狀态類都實作了環境(Context)的一個狀态所對應的行為。
/**
 * 狀态模式
 * 抽象狀态類
 * */
interface State {
    //狀态對應的處理
    fun handle(para: String)
}      
/**
 * 狀态模式
 * 上下文角色
 * */
class Context {
    //持有一個State類型的對象
    private var state: State? = null

    fun setState(state: State) {
        this.state = state
    }

    //使用者感興趣的接口方法
    fun request(para: String) {
        //轉調state來處理
        this.state!!.handle(para)
    }
}      
/**
 * 具體狀态關現類
 * */
class ConcreteStateA : State {
    override fun handle(para: String) {
        println("ConcreteStateA handle: $para")
    }
}      
class ConcreteStateB : State {
    override fun handle(para: String) {
        println("ConcreteStateB handle: $para")
    }
}      

測試

class Main {
    companion object {
        @JvmStatic
        fun main(args: Array<String>) {
            //建立狀态
            val state = ConcreteStateA()
            //建立環境
            val context = Context()
            //set the state into context
            context.setState(state)
            context.request("test")
        }
    }
}      

繼續閱讀