设计模式学习笔记(十五)—State模式
来源:互联网 发布:淘宝模特拍照多少钱 编辑:程序博客网 时间:2024/06/05 03:42
转贴自 http://www.blogjava.net/flustar/archive/2007/12/05/state.html
一、 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
- 设计模式学习笔记(十五)—State模式
- 设计模式学习笔记(十五)—State模式
- 设计模式(c++)笔记之十五(State模式)
- 设计模式之State模式(学习笔记)
- 设计模式学习笔记--状态(State)模式
- 设计模式学习笔记——State状态模式
- 设计模式学习笔记——状态(State)模式框架
- 十五、组合模式——设计模式学习笔记
- 设计模式学习笔记--Strategy、State
- 设计模式笔记-State模式
- 设计模式之十五------State(状态)
- State 模式学习笔记
- State模式学习笔记
- 【设计模式学习笔记十五】【行为模式】【命令模式(Command)】
- java 设计模式学习笔记十五 strategy 策略设计模式
- 设计模式学习笔记二十二(State状态模式)
- 【设计模式】学习笔记14:状态模式(State)
- 【设计模式】学习笔记14:状态模式(State)
- Eclipse 快捷键
- 设计模式学习笔记(十六)—Proxy模式
- 89S51单片机实现误差几微秒的计时程序
- 我的计算机历程
- tomcat负载均衡
- 设计模式学习笔记(十五)—State模式
- 【原创】批处理完成SQLSERVER数据库的附加、分离的小程序。
- 没想到软件资格与水平考试证书还得登记,没三年
- Apache + Tomcat 负载均衡及Session绑定的实现
- 高压大功率放大器PA42及其应用
- linux shell 中"2>&1"含义
- 设计模式学习笔记(十四)—Command模式
- 同时运行两个TOMCAT的配置?
- 说不清,写下来