State的用意在于,允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了他的类。
State模式在实际使用中比较多,适合"状态的切换".因为我们经常会使用If else if else 进行状态切换, 如果针对状态的这样判断切换反复出现,我们就要联想到是否可以采取State模式了.
大家知道,State的用意在于,允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了他的类。我们先看http://www.javacoder.net/patterns.jsp 上提供的GOF SOFTWARE DESIGN PATTERNS CATALOGUE的State模式源码实现。
首先看接口类,State.java
public interface State {
public void handle();
}
定义接口以封装与Conext的一个特定状态相关的行为。
然后看,接口的实现类。
第一个,ConcreteState1.java
public class ConcreteState1 implements State {
public void handle() {
System.out.println("ConcreteState1.handle() executing");
}
}
第二个,ConcreteState2.java
public class ConcreteState2 implements State {
public void handle() {
System.out.println("ConcreteState2.handle() executing");
}
}
这两个类实现了State接口。
然后再看,Context.java是如何将上述三个.java文件联系起来。
public class Context {
public static final int STATE_ONE = 0;
public static final int STATE_TWO = 1;
//大家注意,这句话很关键,该模式做手脚的地方!
private State currentState = new ConcreteState1();
public void request() {
currentState.handle();
}
public void changeState(int state) {
switch (state) {
case STATE_ONE:
currentState = new ConcreteState1();//关键点
break;
case STATE_TWO:
currentState = new ConcreteState2();//关键点
break;
}
}
}
这样,写好4个.java文件后,其实您已经实现了State设计模式,很有趣,对吧?就是这样简单。
再看看如何使用该设计模式了。写一个Client.java看看。
[code]public class Client {
public static void main(String[] args) {
// 构造Context
Context ctx = new Context();
// 唤起Context.request()
ctx.request();
// 改变ctx的状态?为什么改变了呢?大家想想看。
ctx.changeState(Context.STATE_TWO);
// 再次唤起Context.request(),结果大不一样。
ctx.request();
}
}[/code]
参考网页:http://hi.baidu.com/showyearn/blog/item/cce15c0906648c85d0581b1f.html