问题背景
一般解决方法: 创建一个实例变量来保存当前状态,并为每个状态定义值
通过在对象内部创建一个实例变量来存储状态值,并在方法中编写条件代码来处理各种状态。
新加入一个 winner状态
设计
首先定义抽象状态(State)
- 抽象状态是一个接口或抽象类,定义了具体状态类需要实现的方法。
- 这个接口或抽象类通常包含了处理请求的方法,以及可以切换到其他状态的方法。
定义上下文(Context)
- 上下文是拥有某个状态的对象,可以维护一个对抽象状态的引用,并根据状态的变化而改变行为。
- 上下文可以在运行时动态地改变其状态,从而改变其行为。
具体状态(Concrete State):
- 具体状态是抽象状态的具体实现,对应于上下文的不同状态。
- 每个具体状态类负责定义在其状态下的具体行为和处理方式。 下面是SoldState具体状态
模式定义
与策略模式关系
-
相似性: 两者都涉及到将特定的行为封装起来,使得行为可以相互替换。
-
差异性:
-
使用方式不同: 在策略模式中,客户端通常选择具体的策略对象,而在状态模式中,上下文的状态是在内部管理的,客户端对状态对象了解较少。
状态模式,状态改变是在上下文中管理
-
-
动态性: 策略模式允许在运行时动态更改策略对象,而状态模式是通过内部状态的变化来改变行为。
- 选择标准: 策略模式适用于在不同情况下选择算法,而状态模式适用于对象在内部状态变化时改变行为。
总结
状态模式允许一个对象根据其内部状态拥有许多不同的行为。 • 与过程式状态机不同,状态模式将状态表示为一个完整的类。 • 上下文通过委托给其当前所组合的状态对象来获取其行为。 • 通过将每个状态封装成一个类,我们局部化了需要进行的任何更改。