状态模式

标签(空格分隔): 设计模式设计模式


行为型模式。
类的行为是基于它的状态改变的,状态改变,行为跟着改变。
具体实现:
一个状态接口,具体状态类实现该接口。
一个Context类,拥有状态的实例,随着这个状态的改变,它的行为会改变。设计

注重状态的转变,状态只能从一个状态转变按规则转变成另外一个状态,而不是任意转换。例如房间只能从未预订变成预订。对象

类图结构
blog

角色:
环境类(Context): 定义客户感兴趣的接口。维护一个ConcreteState子类的实例,这个实例定义当前状态。
抽象状态类(State): 定义一个接口以封装与Context的一个特定状态相关的行为。
具体状态类(ConcreteState): 每一子类实现一个与Context的一个状态相关的行为。接口

把状态封装成一个类,状态的改变只须要传入不一样的具体state实现便可。程序

当一个对象的行为取决于它的状态,而且它必须在运行时刻根据状态改变它的行为时,就能够考虑使用状态模式来。im

State模式将全部与一个特定的状态相关的行为都放入一个对象(具体state)中。img

应用场景:di

  1. 电灯开关,按一下,状态变成开灯,再按一下,状态变成关灯。
  2. 网上投票,投一次,正常。再投,变成反复投票。再投,取消当次投票资格。再投,系统拉黑,之后不再能投。
  3. 酒店订房系统,房间有预订、入住、退订、退房多种状态。

优势:
新增状态时,一定会增长状态相应的行为,使用状态模式不用为新状态增长不少if else判断,只须要写一个新类实现State接口,而后将状态改为新状态便可。Context会跟据新状态的具体实现来改变行为。loading

状态模式的主要优势在于封装了转换规则,并枚举可能的状态,它将全部与某个状态有关的行为放到一个类中,而且能够方便地增长新的状态,只须要改变对象状态便可改变对象的行为,还可让多个环境对象共享一个状态对象,从而减小系统中对象的个数;其缺点在于使用状态模式会增长系统类和对象的个数,且状态模式的结构与实现都较为复杂,若是使用不当将致使程序结构和代码的混乱,对于能够切换状态的状态模式不知足“开闭原则”的要求。

状态模式和策略模式一个很重要的区别,状态模式的行为是平行性的,不可相互替换的;而策略模式的行为是平等性的,是能够相互替换的。

相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息