《大话设计模式》

第70章

上一章 封面 下一章

小A:“讲了那么多,师兄如果能给我举个例子那就更好了。”

大B:“那我给你举个圣斗士星矢的状态模式和观察者模式的例子吧!”

星矢:动画片《圣斗士星矢》的男猪蹄,超级小强,怎么打也打不死。

雅典娜:动画片《圣斗士星矢》的女猪蹄,自称女神,手下有88个男人为他卖命。

状态模式:为了方便的控制状态的变化,避免一堆IF/ELSE,以及状态规则改变的时避免代码改动的混乱。

观察者模式:一个被观察者一动,多个观察者跟着动,经常用于界面UI。

话说星矢和很强的某斗士甲对打,雅典娜在一边看,星矢总是挨揍,每次挨揍完之后星矢的状态总是会发生一些变化:

正常——挨打——瀕死——挨打——小宇宙爆发——挨打——瀕死——挨打——女神护体——挨打(星矢无敌了,打也没用,战斗结束)——正常

以上状态转变用状态模式来表现,一个Saiya类代表星矢,一个SaiyaState代表他的状态,SaiyaState下面有多个子类,分别代表星矢的多种状态,如正常NORMAL、瀕死DYING、小宇宙爆发UNIVERSE、女神护体GODDESS,即把状态抽象成对象,在每种状态里面实现被打的时候所需要更改的状态,这样就避免了每次被打都要进行一次IF/ELSE的判断。

Java代码

publicclassSaiyaextendsObservable{

//定义星矢的四种状态

publicfinalSaiyaStateNORMAL=newNormalState(this);

publicfinalSaiyaStateDYING=newDyingState(this);

publicfinalSaiyaStateGODDESS=newGoddessState(this);

publicfinalSaiyaStateUNIVERSE=newUniverseState(this);

privateSaiyaStatestate=NORMAL;

privateSaiyaStatelaststate=null;

publicvoidhit{

//调用当前状态的被打方法?反过来改变自己的状态

publicStringstatus{

//当前状态名

protectedvoidsetState(SaiyaStatestate){

laststate=;

=state;

//观察者模式

setChanged;

notifyObservers(“星矢状态变化”);

publicStringgetlastStatus{

publicclassSaiyaextendsObservable{

//定义星矢的四种状态

publicfinalSaiyaStateNORMAL=newNormalState(this);

publicfinalSaiyaStateDYING=newDyingState(this);

publicfinalSaiyaStateGODDESS=newGoddessState(this);

publicfinalSaiyaStateUNIVERSE=newUniverseState(this);

privateSaiyaStatestate=NORMAL;

privateSaiyaStatelaststate=null;

publicvoidhit{

//调用当前状态的被打方法反过来改变自己的状态

publicStringstatus{

//当前状态名

protectedvoidsetState(SaiyaStatestate){

laststate=;

=state;

//观察者模式

setChanged;

notifyObservers(“星矢状态变化”);

publicStringgetlastStatus{

星矢的状态

Java代码

publicabstractclassSaiyaState{

protectedSaiyasaiya;

publicSaiyaState(Saiyasaiya){

=saiya;

publicStringstatus{

Stringname=www.youxs.org;

(+1);

//星矢被打了

publicabstractvoidhit;

publicabstractclassSaiyaState{

protectedSaiyasaiya;

publicSaiyaState(Saiyasaiya){

=saiya;

publicStringstatus{

Stringname=www.youxs.org;

(+1);

//星矢被打了

publicabstractvoidhit;

在每种状态里面实现被打的时候所需要更改的状态,例如小宇宙爆发状态下被打Java代码

publicclassUniverseStateextendsSaiyaState{

/**

*amsaiya

*/

publicUniverseState(Saiyasaiya){

super(saiya);

/*小宇宙爆发状态被打进入瀕死状态

*/

publicvoidhit{

publicclassUniverseStateextendsSaiyaState{

/**

*amsaiya

*/

publicUniverseState(Saiyasaiya){

super(saiya);

/*小宇宙爆发状态被打进入瀕死状态

*/

publicvoidhit{

雅典娜在一边看,星矢每次被打她都要给星矢加油,她是个观察者,星矢是被观察者,这里星矢实现,每次被打hit就notifyObservers,雅典娜就加油。

Java代码

publicclassAthenaimplementsObserver{

/*我是雅典娜我是观察者

*/

publicvoidupdate(Observablearg0,Objectarg1){

(“雅典娜说:星矢加油啊!”);

publicclassAthenaimplementsObserver{

/*我是雅典娜我是观察者

*/

publicvoidupdate(Observablearg0,Objectarg1){

(“雅典娜说:星矢加油啊!”);

总的来看这个过程就是这样子:

Java代码

publicclassStateMain{

publicstaticvoidmain(Stringargs){

Saiyasaiya=newSaiya;

Observerathena=newAthena;

(athena);

(星矢最初的状态是:+);

for(inti=0;i

阅读大话设计模式最新章节 请关注热血小说网(www.oaksh.cn)

上一章 目录 下一章 存书架

其他热门小说

大话设计模式