状态模式
在设计模式的语境下,有 SOLID 原则,其中 S 代表单一职责。
但是有时候出于用户交互的角度考虑,同一个组件会被不同的状态复用,比如最常见的,音乐播放器,再比如,一个面板同时承担对于数据项的 CRUD。
不经考虑,可能就设计出一个类中包含一个状态切换变量以及不同前缀的多套变量及方法,难以理解也难以维护。
状态模式正好可以解决这个问题,也非常容易进行单元测试。
状态模式的思路
- 一个上下文类,它承接了用户交互的入口,用户的操作可能使状态改变,也可能只是作为一个触发动作
- 一个抽象的状态类,它声明了所有可以执行的操作,在不同状态下只选择性地实现当前状态可以执行的操作
- 不同状态的实现类,状态下可以做什么、何时进行状态转移,取决于设计
需要注意的是,状态类中应只实现操作,从而可以手动创建对象,而无需在意其内部状态(引文不持有成员变量),所有的数据都在上下文类中。状态类只是将上下文类在不同状态下的操作代理出去了,上下文类持有一个抽象状态类型变量以及状态切换方法。