工作流中的请假流程
某人提出请假申请,先由项目经理审批,如果项目经理不同意,审批就直接结束
如项目经理同意,再看是否超过3天,如果三天以内,审批直接结束
否则,交给部门经理,部门经理审核后,无论是否同意,审批直接结束。
状态模式特点
1.根据状态来分离和选择行为。
2.状态模式是状态驱动,由上下文负责。
状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况,把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。
就像例题当中,判断请假的状态条件不止一个,先是由项目经历判断是否请假,然后再判断请假的时长是否大于三天,由此可以判断一个对象状态转换的条件表达式过于发杂,可以采用状态模式。
package 公司请假;
public abstract class State {
public abstract void Dd(Date d);
}
package 公司请假;
public class Date {
private State current;
private String People;
private double Tianshu;
private String Reason;
private boolean Pd;
public Date()
{
current=new First();
}
public String getPeople() {
return People;
}
public void setPeople(String people) {
People = people;
}
public double getTianshu() {
return Tianshu;
}
public void setTianshu(double tianshu) {
Tianshu = tianshu;
}
public State getCurrent() {
return current;
}
public void setCurrent(State current) {
this.current = current;
}
public boolean isPd() {
return Pd;
}
public void setPd(boolean pd) {
Pd = pd;
}
public String getReason() {
return Reason;
}
public void setReason(String reason) {
Reason = reason;
}
public void Dd()
{
current.Dd(this);
}
}
package 公司请假;
public class First extends State {
@Override
public void Dd(Date d) {
if(d.isPd()==false) {
System.out.println("请假人:"+d.getPeople()+"请假时间:"+d.getTianshu()+" 请假理由:"+d.getReason()+" 结果:不同意");
}
else
{
d.setCurrent(new Second());
d.Dd();
}
// TODO Auto-generated method stub
}
}
package 公司请假;
public class Second extends State {
@Override
public void Dd(Date d) {
if(d.getTianshu()<=3) {
System.out.println("请假人:"+d.getPeople()+"请假时间:"+d.getTianshu()+" 请假理由:"+d.getReason()+" 结果:同意");
}
else
{
d.setCurrent(new Last());
d.Dd();
}
// TODO Auto-generated method stub
}
}
package 公司请假;
public class Last extends State {
@Override
public void Dd(Date d) {
if(d.isPd()==false) {
System.out.println("请假人:"+d.getPeople()+" 请假时间:"+d.getTianshu()+" 请假理由:"+d.getReason()+" 结果:不同意");
}
else
{
System.out.println("请假人:"+d.getPeople()+" 请假时间:"+d.getTianshu()+" 请假理由:"+d.getReason()+" 结果:同意");
}
// TODO Auto-generated method stub
}
}
package 公司请假;
public class Test {
public static void main(String[] args) {
Date dd=new Date();
dd.setPeople("张三");
dd.setTianshu(2);
dd.setReason("回家探亲");
dd.setPd(true);
dd.Dd();
Date dd2=new Date();
dd2.setPeople("李四");
dd2.setTianshu(7);
dd2.setReason("无理由");
dd2.setPd(false);
dd2.Dd();
}
}
其中的关键是每次有状态转换时,都要写上Dd()这个函数。
在Date类中,Dd()这个函数要重新写入自己。