今天的博客主题
设计模式 ——》 设计模式之状态模式
状态模式 SP (State Pattern)
定义
允许对象在内部状态发生改变时改变它的行为,看起来好像修改了它的类。
类的行为是由状态决定的,不同的状态下该类有不同的行为。就是一个对象在其内部改变的时候,它的行为也随之改变。
核心就是状态与行为的绑定,不同状态对应不同行为。
应用场景
在生活中的场景常见的就是订单状态的改变。
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>