状态模式介绍
状态模式是一种行为设计模式,让你能在一个对象的内部状态变化时改变其行为,使其看上去就像改变了自身所属的类一样。
根据状态不同,行为也不同
状态模式描述的是一个行为下的多种状态变更,比如我们最常见的一个网站的页面,在你登录与不登录时,用户看到的页面是不同的,而这种登录与不登录就是我们通过改变状态而让整个行为发生了变化。
状态模式建议为对象的所有可能状态新建一个类,然后将所有状态的对应行为抽取到这些类中。
原始对象被称为上下文,它并不会自行实现所有行为,而是会保存一个指向表示当前状态对象的引用,且将所有与状态相关的工作委派给该对象。
状态模式结构
- 1、上下文
保存对于一个具体状态对象的引用,并会将所有与该状态相关的工作委派给它。上下文通过状态接口与状态对象交互,且会提供一个设置器用于传递新的状态对象。
- 2、状态接口
会声明特定于状态的方法,这些方法应能被其他所有具体状态所理解,因为你不希望某些状态所拥有的方法永远不会被调用。
- 3、具体状态
会自行实现特定于状态的方法。为了避免多个状态中包含相似代码,你可以提供一个封装有部分通用行为的中间抽象类。
- 4、业务逻辑
上下文和具体状态都可以设置上下文的下个状态,并可通过替代连接到上下文的状态对象来完成实际的状态转换。
状态模式的应用场景
- 对象需要根据自身当前状态进行不同行为,同时状态的数量非常多且与状态相关的代码会频繁变更的话。
- 某个类需要根据成员变量的当前值改变自身行为,从而需要使用大量的条件语句时。
- 当相似状态和基于条件的状态机转换中存在许多重复代码时,可使用状态模式。
实现方式
- 确定那些类是上下文,声明状态接口。
- 为每个实际状态创建一个继承与状态接口的类,然后检查上下文中的方法并将与特定状态相关的所有代码抽取到新建的类中。
- 在上下文类中添加状态接口类型的引用成员变量。
- 再次检查上下文中的方法,将空的条件语句替换为响应的状态对象方法。
- 传递上下文状态。
满足单一职责原则和开闭原则。
Demo
该模式将与状态相关的行为抽取到独立的状态类中,让原对象将工作委派给这些类的实例,而不是自行进行处理。
状态模式可通过受外部控制且能根据对象状态改变行为的方法来识别。
抽象的状态类
实现抽象状态类
上下文类
客户端调用
输出结果
对于状态模式来说,还是得根据具体得业务场景去实现,就是当某个状态改变时,对应业务中有好多耦合得类也得对应做不同得变化时就可以使用状态模式。