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