题目描述
工作流中的请假流程
- 某人提出请假申请,先由项目经理审批,如果项目经理不同意,审批就直接结束
- 如项目经理同意,再看是否超过3天, 如果3天以内,审批直接结束
- 否则,交给部门经理,部门经理不同意,审批就直接结束
- 如部门经理同意,再看是否超过7天, 如果7天以内,审批直接结束
- 否则,交给人力资源部经理,人力资源部经理审核后,无论是否同意,审批直接结束
思路
- 总状态接口,供各种状态所使用
- 上下文类,与总接口是聚合关系,构造函数为第一状态类的初始状态;操作函数为当前对象
- 各个状态都修改对象,并调用具体操作函数
总状态接口:
public abstract class State {
public abstract void WriteProgram(Leave l);
}
请假上下文:
public class Leave {
private State current;
private int day;
private boolean over=false;
public Leave() {
current=new Project();
}
public State getCurrent() {
return current;
}
public void setCurrent(State current) {
this.current = current;
}
public int getDay() {
return day;
}
public void setDay(int day) {
this.day = day;
}
public boolean isOver() {
return over;
}
public void setOver(boolean over) {
this.over = over;
}
public void WriteProgram() {
current.WriteProgram(this);
}
}
状态A:
public class Project extends State {
@Override
public void WriteProgram(Leave l) {
if(l.isOver()) {
System.out.println("项目经理审批结束,未通过");
}else if(l.getDay()<=3){
System.out.println("项目经理审批结束,通过");
}else {
l.setCurrent(new Sector());
l.WriteProgram();
}
}
}
状态B:
public class Sector extends State {
@Override
public void WriteProgram(Leave l) {
if(l.isOver()) {
System.out.println("部门经理审批结束,未通过");
}else if(l.getDay()<=7) {
System.out.println("部门经理审批结束,通过");
}else {
l.setCurrent(new HR());
l.WriteProgram();
}
}
}
状态C:
public class HR extends State {
@Override
public void WriteProgram(Leave l) {
if(l.isOver()) {
System.out.println("人力资源部经理审批结束,未通过");
}else {
System.out.println("人力资源部经理审批结束,通过");
}
}
}
客户端:
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
Leave l=new Leave();
l.setDay(1);
l.WriteProgram();
l.setDay(5);
l.WriteProgram();
l.setOver(true);
l.setDay(11);
l.WriteProgram();
}
}