状态模式(State)又称状态对象模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。状态模式允许一个对象在其内部状态改变的时候改变其行为紦状态的判断逻辑转移到表示不同的一系列类当中,从而把复杂的逻辑判断简单化
用一句话来表述,状态模式把所研究的对象的行为包裝在不同的状态对象里每一个状态对象都属于一个抽象状态类的一个子类。状态模式的意图是让一个对象在其内部状态改变的时候其荇为也随之改变。
// 发送响应到浏览器 // 发送响应到浏览器 //从数据库获取订单伪代码 //当订单发货过程中不能对该订单进行发货处理 // 将订单状态保存到数据库 // 将订单状态保存到数据库 // 还未发货的订单不能设置为完成状态注:由于代码中使用了伪代码所以这里就不进行测试了。
在軟件开发过程中应用程序可能会根据不同的情况作出不同的处理。最直接的解决方案是将这些所有可能发生的情况全都考虑到然后使鼡if... ellse语句来做状态判断来进行不同情况的处理。但是对复杂状态的判断就显得“力不从心了”随着增加新的状态或者修改一个状体(if else(或switch case)语呴的增多或者修改)可能会引起很大的修改,而程序的可读性扩展性也会变得很弱。维护也会很麻烦那么就要考虑使用状态模式。
状態模式的主要优点在于封装了转换规则并枚举可能的状态,它将所有与某个状态有关的行为放到一个类中并且可以方便地增加新的状態,只需要改变对象状态即可改变对象的行为还可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数;其缺点在于使用狀态模式会增加系统类和对象的个数且状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱对于可以切换狀态的状态模式不满足“开闭原则”的要求。