标签:
定义:当一个对象内在状态的改变时允许其改变行为,这个对象看起来像改变了其类
类图:
代码:
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