保捱科技网
您的当前位置:首页State(??)??

State(??)??

来源:保捱科技网
设计模式----State(状态)模式

GoF:允许一个对象在其内部状态改变时,改变他的行为。对象看起来似乎修改了它的类。

在实际的程序开发中,我们经常会用到大量的if elseif else对某种状态进行切换,特别是用惯了结构化语言(C语言)的人。如果状态切换的情况反复出现,我们就可以考虑到采用State模式来代替程序中大量的if elseif else了。在大多数情况下,如果对象的属性不同那么相应得对象的行为要求也不同。对GoF给出的定义做个通俗的解释就是:一个对象在不同的状态下有不同的行为,也可以说对象的每个状态有着不同的行为。

下面给出事例代码(我的这个事例比较简单,但是能反映出State模式的意思):

先来一个状态: package State;

public abstract class State {

/** Creates a new instance of State */ public State() { }

public abstract void opration(); }//end class State

在来两个具体的State: package State;

public class ConcreteStateA extends State {

/** Creates a new instance of ConcreteStateA */ public ConcreteStateA() { }

public void opration() {

System.out.println(\"The Concrete A\"); }//end opration()

public static ConcreteStateA getInstance()

{

return new ConcreteStateA(); }//end getInstance() }

package State;

public class ConcreteStateB extends State {

/** Creates a new instance of ConcreteStateB */ public ConcreteStateB() { }

public void opration() {

System.out.println(\"The Concrete B\"); }//end operation()

public static ConcreteStateB getInstance() {

return new ConcreteStateB(); }//end getInstance()

}//end class ConcreteStateB

来一个场景: package State;

public class Context {

private State state;

/** Creates a new instance of Context */ public Context() { }

public void setSate(State stat) {

state = stat; }//end setState(...)

public void operation() {

state.opration();

}//end operation()

}//end class Context

怎样调用: package State;

public class StatePattern {

State csa;

Context con = new Context();

/** Creates a new instance of StatePattern */ public StatePattern() {

csa = ConcreteStateA.getInstance(); }

public void showStatePattern() {

con.setSate(csa); con.operation();

csa = ConcreteStateB.getInstance(); con.setSate(csa); con.operation(); }//end showStatePattern()

public static void main(String[] args) {

StringBuilder ssb = new StringBuilder(); ssb.append(\"The state pattern!\"); System.out.println(ssb.toString()); StatePattern sp = new StatePattern(); sp.showStatePattern(); }//end main(...)

}//end class StatePattern

下面是UML图:

小结:

State模式和Strategy模式非常的相像,如果不仔细追究,差别不是很大。如果用不好的话很容易将State模式退化成Strategy模式。

因篇幅问题不能全部显示,请点此查看更多更全内容