您的位置:首页 > 其它

设计模式----State(状态)模式

2007-06-13 19:14 591 查看
设计模式----State(状态)模式

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

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

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

下面是UML图:



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


先来一个状态:


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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: