今天的博客主题
设计模式 ——》 设计模式之状态模式
允许对象在内部状态发生改变时改变它的行为,看起来好像修改了它的类。
类的行为是由状态决定的,不同的状态下该类有不同的行为。就是一个对象在其内部改变的时候,它的行为也随之改变。
核心就是状态与行为的绑定,不同状态对应不同行为。
在生活中的场景常见的就是订单状态的改变。
1)行为随状态改变而改变的场景。
2)一个操作中有大量分支存在,而这些分支状态又取决于对象的状态。
3)
1)结构清晰,将状态独立为类,消除分支判断,提高代码维护性。
2)状态类职责明确具备扩展性。
3)
1)如果一个事物具备多种状态,则状态类太多,类膨胀。
2)状态模式的结构与实现都较为复杂,若使用不当则导致程序结构代码混乱。
3)
该模式的具体应用在源码中非常少见。
状态模式主要包含以下几个角色
上下文角色(Context):定义客户端需要的接口,维护一个当前状态实例,进行具体状态切换。
抽象状态角色(state):定义该状态下的行为,可以有一个或多个。
具体状态角色(ConcreteState):实现该状态对应的行为,在需要的情况下进行状态的切换。
// 上下文角色 class Context{ private State state; public void setState(State state) { this.state = state; } } // 抽象状态角色 interface State{ // 抽象业务方法,不同的具体状态类可以不同的实现 void doSome(Context context); } // 具体状态角色 class StartState implements State { @Override public void doSome(Context context) { System.out.println("启动状态"); context.setState(this); } } class StopState implements State { @Override public void doSome(Context context) { System.out.println("停止状态"); context.setState(this); } } // 客户端调用 public class StatePattern { public static void main(String[] args) { Context context = new Context(); StartState start = new StartState(); start.doSome(context); StopState stop = new StopState(); stop.doSome(context); } }将一个对象在不同状态下的不同行为封装在一个个状态类中。
状态机实现状态变动
状态机试状态模式的一种应用,相当于是上下文角色的一个升级版。在工作流和游戏中有大量的使用。spring 也提供了一个很好的解决方案 StateMechine(状态机),帮助我们简化开发过程,让其结构更加层次化。
需要引入jar,就不细说了,自行研究下
<dependency> <groupId>org.springframework.statemachine</groupId> <artifactId>spring-statemachine-core</artifactId> <version>2.1.0.RELEASE</version> </dependency>