标签:
定义:当一个对象内在状态的改变时允许其改变行为,这个对象看起来像改变了其类
类图:
代码:
public abstract class State {
protected Context context;
public void setContext(Context context){
this.context = context;
}
public abstract void handle1();
public abstract void handle2();
}public class ConcreteState1 extends State{
@Override
public void handle1() {
// TODO Auto-generated method stub
}
@Override
public void handle2() {
// TODO Auto-generated method stub
super.context.setCurrentState(Context.STATE2);
super.context.handle2();
}
}public class ConcreteState2 extends State{
@Override
public void handle1() {
// TODO Auto-generated method stub
super.context.setCurrentState(Context.STATE1);
super.context.handle1();
}
@Override
public void handle2() {
// TODO Auto-generated method stub
}
}public class Context {
public static final State STATE1 = new ConcreteState1();
public static final State STATE2 = new ConcreteState2();
private State currentState;
public State getCurrentState(){
return currentState;
}
public void setCurrentState(State currentState){
this.currentState = currentState;
this.currentState.setContext(this);
}
public void handle1(){
this.currentState.handle1();
}
public void handle2(){
this.currentState.handle2();
}
}public class Client {
public static void main(String[] args){
Context context = new Context();
context.setCurrentState(new ConcreteState1());
context.handle1();
context.handle2();
}
}State抽象状态角色
负责对象状态定义。并且封装环境角色以实现状态切换
ConcreteState具体状态角色
每个具体状态角色必须完成两个职责:本状态的行为管理以及趋向状态处理(本状态要做的事,以及本状态如何过度到状态)
Context环境角色
定义客户端需要的接口,并且负责具体状态的切换
优点:
结构清晰
遵循设计原则
封装性好
缺点:
类的膨胀
使用场景
1.行为随着状态的改变而改变
2.条件,分支判断语句的替换
注意:状态模式适用于当某个对象在它的状态发生改变时,它的行为也随着发生比较大的变化,也就是说在行为受状态约束的情况下可以使用状态模式,而且使用的对象的状态最好不要超过5个
标签:
原文地址:http://blog.csdn.net/renpengddxx/article/details/52100081