設計模式-狀態模式


狀態模式 參考

  狀態模式,又稱狀態對象模式(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")
        }
    }
}

 


免責聲明!

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



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