行为模式关注的是对象的响应性,它们通过对象之间的交互以实现更复杂的功能。
状态模式是一种行为设计模式,在该模式中,一个对象可以基于其内部状态封装多个行为。比如根据收音机的基本状态(AM/FM),当调谐到 AM 或 FM 频道时,扫描频道的行为就会相应地发生动态的改变。
1 | from abc import abstractmethod, ABCMeta |
- State:定义
Handle()
抽象方法的接口。需要通过ConcreteState
类实现 - ConcreteState:实现
Handle()
方法,可以根据状态变化定义执行的实际操作 - Context:接收客户端请求,维护着对象当前状态的引用,以根据请求调用具体的行为
简单示例
1 | from abc import abstractmethod, ABCMeta |
真实用例
1 | class ComputerState: |
状态模式的优点
- 在状态设计模式中,对象的行为是其状态的函数结果,且行为在运行时依旧状态而改变。这消除了对 if/else 或 switch/case 条件逻辑的依赖
- 使用状态模式,实现多态行为是很方便的,并且易于添加状态来支持额外的行为
- 状态模式提高了聚合性,针对状态的行为被聚合到 ConcreteState 类中,放置在代码的同一个地方
- 状态模式不仅改善了扩展应用程序行为时的灵活性,且提高了代码的可维护性。一个 ConcreteState 类即对应一种行为
状态模式的缺点
- 类爆炸:由于每个状态都需要在 ConcreteState 中定义,可能导致创建太多功能较为单一的类。既增加了代码量,又使得状态机的结构更加难以审查
- 随着新行为的引入,Context 类需要进行相应的更新以处理每个行为,使得上下文行为更容易受到每个新行为的影响