PHP设计模式---状态模式(State Pattern)

应用

在软件开发过程中,应用程序可能会根据不同的状况作出不同的处理,只直接的方案就是将这些可能的解决方案全都考虑到,然后就是使用if else 语句来做出判断,但是面对比较复杂的判断就不太行了,这样机会影响程序的可读性,扩展性也变得很弱,维护也很麻烦,这时候就考虑到状态模式。
例如: 按钮来控制一个电梯的状态,一个电梯开们,关门,停,运行。每一种状态改变,都有可能要根据其他状态来更新处理。开门状态,你不能在运行的时候开门,而是在电梯定下后才能开门。

概念

允许一个对象在其内部状态改变时候改变它的行为,看起来视乎修改了它的类
在很多情况下,一对象的行为取决于一个或者多个动态变化的属性,这样的属性叫做状态。这样的对象叫有这样的状态的对象,这样的对象就是从事先定好的一系列值中取出,当一个这样的对象与外部事件产生互动时,其内部的状态就会改变,从而使得系统的行为就会改变

使用情况

1、 一个对象的行为取决于它的状态,并且他必须在运行时根据状态的改变改变他的行为
2、代码中大量包含于状态有关的条件语句

实现原理

类中有好多方法,都包含这一相同的条件结构,(这些方法都共同取决于一个状态值)那么就可以将每一个条件分支放入到一个独立的类中,这样你可以根据不同的状态去调用不同的子类对象

优点

1、 封装了转换规则
2、 将所有与某一状态有关的行为放到一个类中 ,可以随便的增加新的状态 ,只需改变状态对象,就可以改变对象行为
3、 允许状态转换与逻辑语句放在一起,而不是每个状态类中的巨大的条件语句块
4、 可以让多个环境类共享一个状态类 ,减少状态类的个数

缺点

1、 状态类的使用必然是系统增加类跟对象的个数
2、 状态模式的结构跟逻辑比较复杂,如果使用不当,很容易造成代码混乱
3、 对“关闭开放原则支持的不太好”,因为增加新的状态还得修改其他的跳转到该新状态的代码 ,否则就无法实现新状态的选择,这就相当于买了个车,没有方向盘一样

备注

状态模式涉及到了两种不同的类,一种是环境类,一种是状态类(这种是某接口或者抽象类的子类),环境类包含着状态类,状态类就是针对环境类某一种状态属性的不同的状态行为体现,具有共同接口的状态行为类,
在环境类中有一个环境属性,这个属性的状态,对应着当前环境类具有那个状态类,当这个状态属性发生改变的时候,所组合的状态类对象就不同,状态类对象的方法就不同,关键在于,这每一个状态对象会按照一定的逻辑改变当前环境类中的环境变量,使得整个环境类觉得好像修改了里面的方法,其实是由于状态的改变,在下次访问环境类的时候,他所引用的状态类发生了改变。