概述:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
简单点说:就是一个类中有一个变化的状态(反正就是一个变化的东西),然后有的动作需要跟随这个状态的变化发生不同的动作,如果状态过多,动作过多,就可以将状态和动作分离出来。为了遵循单一职责原则。
好处:将与特定状态相关的行为局部化,并且将不同状态的行为分割开来,就是分开进行封装。
举例场景:请假流程(这里的流程只是举个例子,正常的oa系统流程是不会一个流程一套类的,一个公司会有上百个流程,所以会做一个通用流程,但是大致意思是这个意思)
状态和动作不分离的情况下
package state.first;
/**
* 工作流 请假申请流程 大于2天 需要公司经理审批 大于11天需要董事长审批
*/
public class Flowwork {
public static void main(String[] args) {
AflFlow aflFlow = new AflFlow(1,21);
aflFlow.option();
aflFlow.option();
aflFlow.option();
aflFlow.option();
aflFlow.option();
aflFlow.option();
aflFlow.option();
/**
* 员工提交请假申请
* 项目组组长进行审批
* 项目经理进行审批
* 请假天数超过了2天,需要公司经理审批
* 公司经理审批
* 请假天数超过了11天,需要公司董事长审批
* 董事长审批
* 审批流程结束
* 审批流程结束
*/
}
}
class AflFlow {
int state;
int day;
public AflFlow(int state, int day) {
this.state = state;
this.day = day;
}
public void option() {
switch (state) {
case 1:
System.out.println("员工提交请假申请");
state = 2;
break;
case 2:
System.out.println("项目组组长进行审批");
state = 3;
break;
case 3:
System.out.println("项目经理进行审批");
if(day > 2) {
System.out.println("请假天数超过了2天,需要公司经理审批");
state = 4;
}else {
state = 6;
}
break;
case 4:
System.out.println("公司经理审批");
if(day > 11) {
System.out.println("请假天数超过了11天,需要公司董事长审批");
state = 5;
}else {
state = 6;
}
break;
case 5:
System.out.println("董事长审批");
state = 6;
break;
case 6:
System.out.println("审批流程结束");
}
}
}
状态和动作分离的情况下
package state.second;
import java.util.Optional;
/**
* 工作流 请假申请流程 大于2天 需要公司经理审批 大于11天需要董事长审批
*/
public class Flowwork {
public static void main(String[] args) {
AlfFlow alfFlow = new AlfFlow(new AlfFlowState1(),21);
alfFlow.option(alfFlow);
alfFlow.option(alfFlow);
alfFlow.option(alfFlow);
alfFlow.option(alfFlow);
alfFlow.option(alfFlow);
alfFlow.option(alfFlow);
alfFlow.option(alfFlow);
/**
* 员工提交请假申请
* 项目组组长进行审批
* 项目经理进行审批
* 请假天数超过了2天,需要公司经理审批
* 公司经理审批
* 请假天数超过了11天,需要公司董事长审批
* 董事长审批
* 审批流程结束
* 审批流程结束
*/
}
}
class AlfFlow {
AlfFlowState alfFlowState;
int day;
public AlfFlow(AlfFlowState alfFlowState, int day) {
this.alfFlowState = alfFlowState;
this.day = day;
}
public void option(AlfFlow alfFlow) {
alfFlowState.option(alfFlow);
}
}
interface AlfFlowState {
public int state = 1;
public void option(AlfFlow alfFlow);
}
class AlfFlowState1 implements AlfFlowState{
@Override
public void option(AlfFlow alfFlow) {
System.out.println("员工提交请假申请");
alfFlow.alfFlowState = new AlfFlowState2();
}
}
class AlfFlowState2 implements AlfFlowState{
@Override
public void option(AlfFlow alfFlow) {
System.out.println("项目组组长进行审批");
alfFlow.alfFlowState = new AlfFlowState3();
}
}
class AlfFlowState3 implements AlfFlowState{
@Override
public void option(AlfFlow alfFlow) {
System.out.println("项目经理进行审批");
if(alfFlow.day > 2) {
System.out.println("请假天数超过了2天,需要公司经理审批");
alfFlow.alfFlowState = new AlfFlowState4();
}else {
alfFlow.alfFlowState = new AlfFlowState6();
}
}
}
class AlfFlowState4 implements AlfFlowState{
@Override
public void option(AlfFlow alfFlow) {
System.out.println("公司经理审批");
if(alfFlow.day > 11) {
System.out.println("请假天数超过了11天,需要公司董事长审批");
alfFlow.alfFlowState = new AlfFlowState5();
}else {
alfFlow.alfFlowState = new AlfFlowState6();
}
}
}
class AlfFlowState5 implements AlfFlowState{
@Override
public void option(AlfFlow alfFlow) {
System.out.println("董事长审批");
alfFlow.alfFlowState = new AlfFlowState6();
}
}
class AlfFlowState6 implements AlfFlowState{
@Override
public void option(AlfFlow alfFlow) {
System.out.println("审批流程结束");
}
}
这样做的好处就是在增加或者减少流程的时候 只需要 增加或者修改相应的类就可以了