分类:
2008-09-10 09:59:27
星矢:动画片《圣斗士星矢》的男猪脚,超级小强,怎么打也打不死。
雅典娜:动画片《圣斗士星矢》的女猪脚,自称女神,手下有88个男人为他卖命。
状态模式:为了方便的控制状态的变化,避免一堆IF/ELSE,以及状态规则改变的时避免代码改动的混乱。
观察者模式:一个被观察者一动,多个观察者跟着动,经常用于界面UI。
话说星矢和很强的某斗士甲对打,雅典娜在一边看,星矢总是挨揍,每次挨揍完之后星矢的状态总是会发生一些变化:
正常--挨打--瀕死--挨打--小宇宙爆发--挨打--瀕死--挨打--女神护体--挨打(星矢无敌了,打也没用,战斗结束)--正常
以上状态转变用状态模式来表现,一个Saiya类代表星矢,一个SaiyaState代表他的状态,SaiyaState下面有多个子类,分别代表星矢的多种状态,如正常NORMAL、瀕死DYING、小宇宙爆发UNIVERSE、女神护体GODDESS,即把状态抽象成对象,在每种状态里面实现被打的时候所需要更改的状态,这样就避免了每次被打都要进行一次IF/ELSE的判断。
代码
public class Saiya extends Observable { //定义星矢的四种状态 public final SaiyaState NORMAL = new NormalState(this); public final SaiyaState DYING = new DyingState(this); public final SaiyaState GODDESS = new GoddessState(this); public final SaiyaState UNIVERSE = new UniverseState(this); private SaiyaState state=NORMAL; private SaiyaState laststate=null; public void hit(){ //调用当前状态的被打方法 反过来改变自己的状态 state.hit(); } public String status(){ //当前状态名 return state.status(); } protected void setState(SaiyaState state){ laststate=this.state; this.state=state; //观察者模式 setChanged(); notifyObservers("星矢状态变化"); } public String getlastStatus(){ return laststate.status(); } public class Saiya extends Observable { //定义星矢的四种状态 public final SaiyaState NORMAL = new NormalState(this); public final SaiyaState DYING = new DyingState(this); public final SaiyaState GODDESS = new GoddessState(this); public final SaiyaState UNIVERSE = new UniverseState(this); private SaiyaState state=NORMAL; private SaiyaState laststate=null; public void hit(){ //调用当前状态的被打方法 反过来改变自己的状态 state.hit(); } public String status(){ //当前状态名 return state.status(); } protected void setState(SaiyaState state){ laststate=this.state; this.state=state; //观察者模式 setChanged(); notifyObservers("星矢状态变化"); } public String getlastStatus(){ return laststate.status(); } |
[1]