状态模式
State模式问题主要是逻辑分散化,状态逻辑分布到了很多的State的子类中,很难看到整个的状态逻辑图,这也带来了代码的维护问题。
public abstract class State {
public abstract void Handle(Context context);
}
public class ConcreteStateA extends State{
@Override
public void Handle(Context context) {
context.setState(new ConcreteStateB()); //设置A的下一个状态是B
}
}
class ConcreteStateB extends State{
@Override
public void Handle(Context context) {
context.setState(new ConcreteStateC()); //设置B的下一个状态是C
}
}
class ConcreteStateC extends State{
@Override
public void Handle(Context context) {
context.setState(new ConcreteStateA()); //设置C的下一个状态是A
}
}
public class Context {
State state;
public Context(State state) { //定义Context的初始状态
super();
this.state = state;
}
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
System.out.println("当前状态为"+state);
}
public void request(){
state.Handle(this); //对请求做处理并且指向下一个状态
}
}
【问题】 工作流中的请假流程:
package 状态模式;
public class Context {
private State st;
private int days;
private String name;
private String pro;
private String dept;
private boolean ProjectManager,DepartmentManager,BossManager;
public Context(int days, String name, String pro, String dept, boolean projectManager, boolean departmentManager,
boolean boss) {
super();
this.days = days;
this.name = name;
this.pro = pro;
this.dept = dept;
ProjectManager = projectManager;
DepartmentManager = departmentManager;
this.BossManager = boss;
}
public boolean isBossManager() {
return BossManager;
}
public void setBossManager(boolean bossManager) {
BossManager = bossManager;
}
public Context( int days, String name, String pro, String dept, boolean projectManager,
boolean departmentManager) {
super();
this.days = days;
this.name = name;
this.pro = pro;
this.dept = dept;
ProjectManager = projectManager;
DepartmentManager = departmentManager;
}
public Context() {
super();
// TODO Auto-generated constructor stub
}
public int getDays() {
return days;
}
public void setDays(int days) {
this.days = days;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isProjectManager() {
return ProjectManager;
}
public void setProjectManager(boolean projectManager) {
ProjectManager = projectManager;
}
public boolean isDepartmentManager() {
return DepartmentManager;
}
public String getDept() {
return dept;
}
public void setDept(String dept) {
this.dept = dept;
}
public String getPro() {
return pro;
}
public void setPro(String pro) {
this.pro = pro;
}
public void setDepartmentManager(boolean departmentManager) {
DepartmentManager = departmentManager;
}
public void leave() {
st.leave(this);
}
}
package 状态模式;
public abstract class State {
public abstract void leave(Context con);
}
package 状态模式;
public class Accept extends State {
@Override
public void leave(Context con) {
if(con.isProjectManager()==false) {
System.out.println(con.getPro()+"经理不同意请假!"+con.getName()+"的请假");
}else {
Less3 tdl=new Less3();
tdl.leave(con);
}
}
}
package 状态模式;
public class Less3 extends State {
@Override
public void leave(Context con) {
if(con.getDays()<=3) {
System.out.println(con.getPro() +"项目经理同意!"+con.getName()+"的请假审批通过!共请假"+con.getDays()+"天!");
}else {
System.out.println("请假时间超过三天,请移至"+con.getDept()+"部门经理处!");
More3_Less7 tdo=new More3_Less7();
tdo.leave(con);
}
}
}
package 状态模式;
public class More3_Less7 extends State {
@Override
public void leave(Context con) {
if(con.getDays()<=7) {
System.out.println(con.getDept()+"部门经理同意!"+con.getName()+"的请假审批通过!共请假"+con.getDays()+"天!");
}else {
System.out.println("请假时间超过7天,请移至总经理!");
More7 tdo=new More7();
tdo.leave(con);
}
}
}
package 状态模式;
public class More7 extends State {
@Override
public void leave(Context con) {
if(con.isBossManager()==true) {
System.out.println(con.getPro()+"项目经理同意!"+con.getDept()+"部门经理同意!总经理同意!"+con.getName()+"的请假审批通过!共请假"+con.getDays()+"天!");
}else {
System.out.println(con.getPro()+"项目经理同意!"+con.getDept()+"部门经理同意!总经理不同意!"+con.getName()+"的请假审批不通过!");
}
}
}
package 状态模式;
public class Client {
public static void main(String[] args) {
Context con = new Context(8,"菜鸡","设计模式","设计",true,true,true);
con.setName("菜鸡");
con.setPro("设计模式");
con.setDept("设计");
con.setDays(8);
con.setProjectManager(true);
con.setDepartmentManager(true);
con.leave();
}
}