封装数据的状态流转逻辑。这个状态模式呢,叫做state模式啊,然后给大家来举一个场景,就比如说,咱们这个销售出货单,它那个状态需要从新建,然后待审批,已审批,已完成,四个状态之间流转,然后每个,流转到每个状态的时候,都需要执行那个状态对应的一个逻辑,然后我们直接把这个状态模式的代码直接做出来,StatePatternDemo,其实这个状态模式,大概是这样的,它这里面会有一个接口,它这个接口叫做State,这里面会有一个execute();,比如说执行什么逻辑,然后它这里会有一个class,比如说这个NewState implements State,新建这个状态,然后,是这样子,执行这个销售单出库新建状态的逻辑,然后我们一共是4个状态么,然后,一个新建,一个叫做待审批,我们叫做ApprovingState,然后执行ApprovedState,已审批,最后,我们执行FinishedState已完成,执行销售单出库待审批状态的逻辑,执行销售单出库已审批状态的逻辑,执行销售单出库已完成状态的逻辑,好,这个是多种状态。
然后的话呢,我们写一个Context,里面有一个State,有一个初始的Context,和一个execute(),
public void execute(int stateType){
if(stateType == 1) {
this.state = new ApprovingState();
this.state.execute();
} else if (stateType == 2) {
this.state = new ApprovedState();
this.state.execute();
} else if (stateType == 3) {
this.state = new FinishedState();
this.state.execute();
}
}
好,那么它其实就是说是这样的一个概念啊。然后main方法这边的 话,
public static void main(String[] args) {
Context context = new Context(new NewState());
context.execute(1);
context.execute(2);
context.execute(3);
}
好,你看一下,
执行销售出货单新建状态的逻辑
执行销售出货单待审批状态的逻辑
执行销售出货单已审批状态的逻辑
执行销售出货单已完成状态的逻辑
那么来看一下,这个状态模式,是什么意思,就是如果说,你的某一个数据,它有一个状态,什么概念,那你就可以把这个数据不同的状态要执行的一些业务逻辑,封装到某个类里面去,然后专门搞一个Context,在这个Context上传一个参数,根据传入的参数不同,然后这个context负责控制这个状态的流转,比如传什么参数的时候,这个数据的状态,就流转到那个状态下,同时的话,去那个执行那个状态对应的state里面的这个业务逻辑,也就是说,它适合的场景是什么呢,就是说这个数据有状态,然后既然有状态,那么这个状态就一定会这个流转,就会会从,一定会从状态1,这个变化成状态2,对吧,然后有一个context,或者这么说吧,将不同的状态要执行的代码逻辑封装在不同的state类中,然后有一个context类,负责根据传入的参数,然后决定这份数据的这个状态,流转到什么状态,同时负责执行那个新状态的代码逻辑,ok,这个状态模式是这样一个思路,我之所以没有跟大家说,不用这个模式的代码是怎么写的是因为我都不想去写了,因为它其实,实在是适合的场景太明显了,就是只要有状态,都按照这个标准的状态模式来实现,当然这里面可以做一些改进,但是这个状态的思想,就是说是,不同的状态逻辑放不同的这个state类,然后那个要有一个类负责这个状态之间的流转,以及这个状态逻辑的执行,所以它适合的就是这个场景,你只要遇到这个场景就用模式的核心思想来设计,那么这个它主要的好处是什么,是对于有状态的这个场景,按照面向对象的思想来设计,而不是说在一堆代码里面,比如说又是一堆if-else,if-else,比如说if 开始执行那个状态的一堆逻辑,这个else if是什么东西,开始执行另外一个的一堆逻辑,如果你那样写的话,它又是屎一样的代码,它按照状态模式的这个思想,把不同的状态模式封装一下,统一控制状态之间的流转,和状态逻辑的执行,那这样的话,这个代码很清晰,可读性很好,可维护性很好。那么这个整个状态模式就是这么一个思路。那么后面这个状态模式,其实你看这个电商系统里面,天然的就有很多状态模式的一些运用场景,因为我们系统是由大量状态变更的一个逻辑的,那么我们就可以完全用这个状态模式来实现,比如各种单子,它的这个变更时候的状态的流转,和每一个单子的代码逻辑对吧,这个是到后面,我们在电商系统里去实现。