一、 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();
}
}
输出结果:
handle by ConcreteStateA
handle by ConcreteStateB
handle by ConcreteStateA
handle by ConcreteStateB
每请求一次,状态就更换一次,就执行对应的行为。
六、 适用性
1) 一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
2) 一个对象含有庞大的条件分支语句,这些分支依赖于它的状态。这个状态通常用一个或多个枚举常量表示。通常有多个操作包含这一相同的结构。State模式将每一个分支放入一个独立的类中。这使得你可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化。
七、 优缺点
1) 优点: 避免了为判断状态而产生的巨大的if或case语句。 将对象行为交给状态类维护后,对于上层程序而言,仅需要维护状态之间的转换规则。
2) 会导致某些系统有过多的具体状态类。
八、 参考
http://www.cppblog.com/converse/archive/2006/08/07/10902.html
http://www.blogjava.net/flying/archive/2006/08/29/66472.html
分享到:
相关推荐
设计模式学习笔记,分析了GOF的23种模式和类设计的原则
Java设计模式学习笔记
我收集的设计模式的学习笔记,采用pdf格式,便于收藏和查看
各个模式都有详细的例子C#学习笔记,打开就知道了
HeadFirst设计模式学习笔记比较全面详细地讲解了13个设计模式,有利于大家更好的学习HeadFirst设计模式,希望亲们会喜欢~~~
总结了java开发中的21种设计模式,详解和例子,带书签的pdf格式,方便阅读!
设计模式学习笔记.ppt 自己写的一点学习笔记。
设计模式学习笔记,总共23个设计模式,还有几个设计原则
Head First 设计模式学习笔记。更多内容请参见文章内容。
23种设计模式学习笔记及源码,全部原创 欢迎提出意见和建议
学习Java设计模式的笔记,标注了其中重要的要点,如果有需要的小伙伴,自行下载哦
设计模式学习笔记(十五)命令模式及在Spring JdbcTemplate 中的实现.doc
设计模式学习笔记--Flyweight享元模式.docx设计模式学习笔记--Flyweight享元模式.docx设计模式学习笔记--Flyweight享元模式.docx设计模式学习笔记--Flyweight享元模式.docx设计模式学习笔记--Flyweight享元模式.docx
代理模式学习笔记、单例模式学习笔记、命令模式、原型模式、模式特点总结。 为个人对设计模式的理解,如果有理解不一致的不要砸砖啊
学习设计模式入门的好材料 简单明了,一看就懂 帮助你快速学习或是复习23种设计模式
设计模式学习笔记-命令模式
java设计模式的学习笔记,其中包含各种模式的代码实现
Head.First 设计模式学习笔记.pdf Head.First 设计模式学习笔记.pdf
资源名称:设计模式C 学习笔记资源目录:【】设计模式C 学习笔记源代码【】设计模式C 学习笔记目录【】设计模式C 学习笔记(1)【】设计模式C 学习笔记(2)【】设计模式C 学习笔记(3)【】设计模式C 学习笔记(4)...
设计模式学习笔记,这里面详细的记录我学习23三种设计模式的详细过程以及实例代码哦哦