状态模式 参考
状态模式,又称状态对象模式(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") } } }