什么是状态模式
状态模式(state):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
UML图
小练习
实现请假机制(不同长度要又不同的人决定)
public class Context {
protected State state;
private int time;
private String status;
public Context(State state,int time){
this.state=state;
this.time=time;
status="未答复";
}
public void request(){
state.handle(this);
}
public int getTime(){
return time;
}
public void setStatus(String a){
status=a;
}
public String getStatus(){return status;}
}
public abstract class State {
public abstract void handle(Context context);
public abstract String getOpinion();
}
public class ProjectManager extends State{
@Override
public void handle(Context context) {
System.out.println("项目经理处理请假");
if(getOpinion().equals("同意")){
if(context.getTime()>3){
context.state=new DepartManager();
context.request();
}else context.setStatus("同意");
}else context.setStatus("不同意");
}
@Override
public String getOpinion() {
// TODO Auto-generated method stub
return "同意";
}
}
public class DepartManager extends State{
@Override
public void handle(Context context) {
System.out.println("部门经理处理请假");
// TODO Auto-generated method stub
if(getOpinion().equals("同意")){
context.setStatus("同意");
}else context.setStatus("不同意");
}
@Override
public String getOpinion() {
return "同意";
}
}
public class test {
public static void main(String[] args) {
Context context=new Context(new ProjectManager(), 3);
context.request();
System.out.println(context.getStatus());
}
}
使用场景
1、 如果对象需要根据自身当前状态进行不同行为, 同时状态的数量非常多且与状态相关的代码会频繁变更的话, 可使用状态模式。
模式建议你将所有特定于状态的代码抽取到一组独立的类中。 这样一来, 你可以在独立于其他状态的情况下添加新状态或修改已有状态, 从而减少维护成本。
2、当相似状态和基于条件的状态机转换中存在许多重复代码时, 可使用状态模式。
状态模式让你能够生成状态类层次结构, 通过将公用代码抽取到抽象基类中来减少重复。