定义:
允许一个对象在其内部状态改变时改变它的行为,这个对象看起来就像改变了它的类一样。
状态模式的含义是将对象的状态封装成一个独立的类,并将动作行为委托到代表当前状态的对象,行为会随着内部的状态而改变。状态模式是通过状态对象来改变动作行为,而不同的状态对象里不同的动作行为表现会不一样,这使得它看起来就像在改变它的类一样。

状态模式中的角色:
Context上下文环境角色,负责状态的切换,持有一个内部状态对象,代表着环境当前所处的状态。
State抽象状态角色, 可以是一个接口或者抽象类,定义了所有具体状态的共同接口或者是说动作行为,任何具体状态都要实现这些接口。
ConcreteState具体状态角色,处理来自Context的请求,每一个ConcreteState都提供了它自己对请求的实现,它要完成两个任务,一个是本状态下的行为管理,另一个是如何过渡到下一个状态。并且持有环境角色以实现状态的切换。
状态模式的优点
结构清晰,避免了过多的 switch- case 或者 if- else 语句的使用,避免了程序的复杂性,提高系统的可维护性。
封装性强,遵循设计原则,很好地体现了开闭原则和单一职责原则,每个状态都有一个子类负责,你要增加状态就要增加子类,你要修改状态,你只修改一个子类就可以了。另外也体现了迪米特法则,状态变换完全放到类的内部来实现,屏蔽了客户端调用的时候对状态处理的感知。
状态模式的缺点
缺点很明显,那就是子类会太多,因为每一个状态都对应一个子类,所以当你的状态非常多的时候就会发生类膨胀。
状态模式和策略模式的区别
状态模式和策略模式有着相同的类图, 但是它们的意图不同。策略模式更加侧重于行为或算法的替换,并且可以在运行时动态的任意替换,侧重点是使用不同算法族来解决问题。而状态模式更加侧重于状态的改变影响改变行为,而行为的执行结果又会导致状态发生变化,是一个状态和行为的变化过程。策略模式需要客户端必须完全知晓所有的策略方法,才能够知道究竟哪一个策略是当前需要的。而状态模式客户端在使用的时候,可以不必关心有哪些状态,他只需要去调用环境的行为就可以了,在环境的内部维护了这些状态。
状态模式的使用场景
行为随着状态的改变而改变的时候,这也是状态模式的根本出发点,例如权限设计,人员的状态不同即使执行相同的行为结果也会不同,在这种情况下需要考虑使用状态模式。
条件、分支判断语句的替代者,在程序中大量使用 switch 语句或者if-else判断语句会导致程序结构不清晰,逻辑混乱,使用状态模式可以很好地避免这一问题。
虽然状态模式可以很好的处理行为受状态约束的情况,但相应的对象的状态也会增加,所以在实际项目中使用的时候,要权衡利弊,考虑它对你的设计带来的后果影响是否可以接受。如果状态太多比如十几个或者几十个,还是建议不要使用了。
原文:https://blog.csdn.net/lyabc123456/article/details/80476317
网友评论