设计模式学习笔记(十五)—State模式
一、 State模式定义:
允许一个对象在其状态改变时,改变它的行为。看起来对象似乎修改了它的类。
二、 模式解说
State模式主要解决的是在开发中时常遇到的根据不同的状态需要进行不同的处理操作的问题,而这样的问题,大部分人是采用switch-case语句进行处理的,这样会造成一个问题:分支过多,而且如果加入一个新的状态就需要对原来的代码进行编译。State模式采用了对这些不同的状态进行封装的方式处理这类问题,当状态改变的时候进行处理然后再切换到另一种状态,也就是说把状态的切换责任交给了具体的状态类去负责.同时,State模式和Strategy模式有很多相似的地方,需要说明的是两者的思想都是一致的,只不过封装的东西不同:State模式封装的是不同的状态,而Stategy模式封装的是不同的算法。
三、 结构图
State模式结构图如下:
四、 怎么使用?
1) 定义一个State接口,接口中有一个统一的方法,用以封装一个特定状态所对应的行为。
2) 定义具体不同状态类ConcreteSate实现State接口。
3) 每一个状态类都实现环境(Context)一个状态所对应的行为。
4) 定义一个状态管理器Context.
五、 一个例子
interface State{ public void handle(Context ctx);}class ConcreteStateA implements State{ public void handle(Context ctx) { System.out.println("handle by ConcreteStateA"); if(ctx!=null){ ctx.ChangeState(new ConcreteStateB()); } } }class ConcreteStateB implements State{ public void handle(Context ctx) { System.out.println("handle by ConcreteStateB"); if(ctx!=null){ ctx.ChangeState(new ConcreteStateA()); } } }class Context{ private State _state; public Context(State state){ _state=state; } public void request(){ if(_state!=null){ _state.handle(this); } } public void ChangeState(State s){ if(_state!=null){ _state=null; } _state=s; }}public class StateClient { public static void main(String[] args) { State state=new ConcreteStateA(); Context context=new Context(state); context.request(); context.request(); context.request(); context.request(); }}