设计模式二十二--状态模式
2019-04-03 本文已影响0人
朽木亦自雕
定义
当一个状态在内部状态改变时允许改变行为,这个对象看起来像改变了类型。
状态模式的角色
1:抽象状态角色(State)
该角色用以封装环境对象的一个特定状态对应的行为。
public abstract class State{
protected Context context;
public void setContext(Context context){
this.context = context;
}
public abstract void handle();
}
2:具体状态角色(ConcreteState)
该角色实现环境的一个状态所对应的行为。
public class ConcreteState1 extends State{
@Override
public void handle(){
System.out.println("行为1")
}
}
public class ConcreteState2 extends State{
@Override
public void handle(){
System.out.println("行为2")
}
}
3:环境角色(Context)
该角色定义客户端需要的接口,并负责具体状态切换,它会保留一个具体状态类的实例,该实例给出环境对象的现有状态。
public class Context{
public static State STATE1 = new ConcreteState1();
public static State STATE2 = new ConcreteState2();
private State currentState;
public State getCurrentState(){
return this.currentState;
}
public void setCurrentState(State currentState){
this.currentState = currentState;
}
public void handle1(){
tis.setCurrentState(STATE1);
this.currentState.handle();
}
public void handle2(){
this.setCurrentState(STATE2);
this.currentState.handle();
}
}
客户端代码:
public class Client{
public static void main(String [] args){
Context context = new Context();
context.handle1();
context.handle2();
}
}
优点
1:结构清晰。
2:遵循设计模式。
3:封装性非常好。
缺点
子类太多,不易于管理。需要对每一个可能取得的状态,创建一个子类,并且要在Context中创建对应的调用handle方法。
使用场景
1:对象的行为依赖于它所处的状态,即行为随着状态改变的场景。
2:对象在某个方法中依赖于一重或者多重分支语句,此时可以使用状态模式,将分支语句中的每一个分支都包装到一个单独的类中,使得这些条件语句能够以类的方式独立存在和演化。
参考资料:设计模式(java)