Behavioral模式State模式
1.意向
同意一个目标,然后改变其内部状态,改变它的行为。
对象似乎改变它的类别。
2.别名
状态对象(Objects for States)
3.动机
考虑一个表示网络连接的类TCPConnection。一个TCPConnection对象的状态处于若干不同状态之中的一个:连接已建立(Established)、正在监听(Listenling)。连接已关闭(Closed)。当一个TCPConnection对象收到其它对象的请求时。它依据自身的当前状态做出不同的反应。比如,一个Open请求的结果依赖于该连接是处于连接已关闭状态还是连接已建立状态。
State模式描写叙述了TCPConnection如何在每一种状态下表现出不同的行为。
4.适用性
下面情况使用State模式:
- 一个对象的行为取决于它的状态,并且他必须在执行时刻依据状态改变它的行为。
- 一个操作中含有庞大的多分支的条件语句。且这些分支依赖于该对象的状态。这个状态通经常使用一个或多个枚举常量表示。通常,有多个操作包括这一同样的条件结构。State模式将每个条件分支放入一个独立的类中。
这使得你能够依据对象自身情况将对象的状态作为一个对象,这一对象能够不依赖于其它对象而独立变化。
5.结构
核心思想就是:当对象的状态改变时,同一时候改变其行为。非常好理解!就拿QQ来说。有几种状态。在线、隐身、忙碌等,每个状态相应不同的操作,并且你的好友也能看到你的状态,所以。状态模式就两点:1、能够通过改变状态来获得不同的行为。2、你的好友能同一时候看到你的变化。看图:
6.代码演示样例
State类是个状态类,Context类能够实现切换。我们来看看代码::
实现代码:
状态结构:
package com.xtfggef.dp.state;
/**
* 状态类的核心类
* 2012-12-1
* @author erqing
*
*/
public class State {
private String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public void method1(){
System.out.println("execute the first opt!");
}
public void method2(){
System.out.println("execute the second opt!");
}
}
实现:
package com.xtfggef.dp.state;
/**
* 状态模式的切换类 2012-12-1
* @author erqing
*
*/
public class Context {
private State state;
public Context(State state) {
this.state = state;
}
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
public void method() {
if (state.getValue().equals("state1")) {
state.method1();
} else if (state.getValue().equals("state2")) {
state.method2();
}
}
}
測试类:
public class Test {
public static void main(String[] args) {
State state = new State();
Context context = new Context(state);
//设置第一种状态
state.setValue("state1");
context.method();
//设置另外一种状态
state.setValue("state2");
context.method();
}
}
“`
输出:
execute the first opt!
execute the second opt!
依据这个特性,状态模式在日常开发中用的挺多的,尤其是做站点的时候,我们有时希望依据对象的某一属性,差别开他们的一些功能,比方说简单的权限控制等。
7.相关模式
- Flyweight模式:解释了何时以及如何共享状态对象。
- 状态对象一般是Singleton。
引用:
http://openhome.cc/Gossip/DesignPattern/DecoratorPattern.htm
http://item.jd.com/10057319.html
http://blog.csdn.net/zhangerqing/article/details/8239539