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