天天看点

设计模式-状态模式

状态模式 参考

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

继续阅读