知识大全 圣斗士星矢的状态模式和观察者模式

Posted 状态

篇首语:亦余心之所善兮,虽九死其犹未悔。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 圣斗士星矢的状态模式和观察者模式相关的知识,希望对你有一定的参考价值。

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

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

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

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

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

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

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

  Java代码

   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();   

  星矢的状态

  Java代码 

   public abstract class SaiyaState    protected Saiya saiya;   public SaiyaState(Saiya saiya)    this saiya = saiya;      public String status()   String name=getClass() getName();   return name substring(name lastIndexOf( )+ );      //星矢被打了   public abstract void hit();      public abstract class SaiyaState    protected Saiya saiya;   public SaiyaState(Saiya saiya)    this saiya = saiya;      public String status()   String name=getClass() getName();   return name substring(name lastIndexOf( )+ );      //星矢被打了   public abstract void hit();   

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

  Java代码

   public class UniverseState extends SaiyaState    /**   * @param saiya   */   public UniverseState(Saiya saiya)    super(saiya);      /* 小宇宙爆发状态被打进入濒死状态   *   */   public void hit()    saiya setState( saiya DYING);         public class UniverseState extends SaiyaState    /**   * @param saiya   */   public UniverseState(Saiya saiya)    super(saiya);      /* 小宇宙爆发状态被打进入濒死状态   *   */   public void hit()    saiya setState( saiya DYING);      

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

  Java代码 

   public class Athena implements Observer    /* 我是雅典娜 我是观察者   *   */   public void update(Observable arg  Object arg )    System out println( 雅典娜说 星矢加油啊!!! );         public class Athena implements Observer    /* 我是雅典娜 我是观察者   *   */   public void update(Observable arg  Object arg )    System out println( 雅典娜说 星矢加油啊!!! );      

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

  Java代码

   public class StateMain    public static void main(String[] args)    Saiya saiya = new Saiya();   Observer athena = new Athena();   saiya addObserver(athena);   System out println( 星矢最初的状态是  + saiya status());   for (int i =  ; i <  ; i++)    System out println( 星矢被揍了  + (i +  ) +  次 );   saiya hit();   System out println( 星矢现在的状态是  + saiya status());            public class StateMain    public static void main(String[] args)    Saiya saiya = new Saiya();   Observer athena = new Athena();   saiya addObserver(athena);   System out println( 星矢最初的状态是  + saiya status());   for (int i =  ; i <  ; i++)    System out println( 星矢被揍了  + (i +  ) +  次 );   saiya hit();   System out println( 星矢现在的状态是  + saiya status());         

  结果星矢在雅典娜的帮助下 有惊无险的战胜了很强的某斗士甲

  Java代码

  星矢最初的状态是 NormalState

  星矢被揍了 次

  雅典娜说 星矢加油啊!!!

  星矢现在的状态是 DyingState

  星矢被揍了 次

  雅典娜说 星矢加油啊!!!

  星矢现在的状态是 UniverseState

  星矢被揍了 次

  雅典娜说 星矢加油啊!!!

  星矢现在的状态是 DyingState

  星矢被揍了 次

  雅典娜说 星矢加油啊!!!

  星矢现在的状态是 GoddessState

  星矢被揍了 次

  雅典娜说 星矢加油啊!!!

  星矢现在的状态是 NormalState

  星矢最初的状态是 NormalState

  星矢被揍了 次

  雅典娜说 星矢加油啊!!!

  星矢现在的状态是 DyingState

  星矢被揍了 次

  雅典娜说 星矢加油啊!!!

  星矢现在的状态是 UniverseState

  星矢被揍了 次

  雅典娜说 星矢加油啊!!!

  星矢现在的状态是 DyingState

  星矢被揍了 次

  雅典娜说 星矢加油啊!!!

  星矢现在的状态是 GoddessState

  星矢被揍了 次

  雅典娜说 星矢加油啊!!!

  星矢现在的状态是 NormalState

cha138/Article/program/Java/gj/201311/27341

相关参考

知识大全 爪哇语言观察者模式介绍

  简单地说观察者模式定义了一个一对多的依赖关系让一个或多个观察者对象监察一个主题对象这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象使这些观察者对象能够自动更新  观察者模式

知识大全 观察者模式 - 设计模式

  观察者模式定义了一个一对多的对象关系一个主体对象对应多个观察者对象当主体对象发生改变时所有它对应的观察者对象都会自动得到通知并更新  本文将给出一个相应的事例具体说明观察者模式是如果工作的这个事例

知识大全 设计模式-快餐简解-观察者模式

  【观察者模式应用场景举例】  比如在玩极品飞车这款游戏每一个车手到达终点的时候都会在其它车手的屏幕上显示某某人以多少时间到达终点的提示其实这就是一个典型的观察者模式的应用观察者模式即是典型的双向一

知识大全 java 设计模式之 观察者模式(Observer)

java设计模式之观察者模式(Observer)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 开发设计模式——asp.net中实现观察者模式

   在中实现观察者模式?难道中的观察者模式有什么特别么?嗯基于Http协议的Application难免有些健忘我是这样实现的不知道有没有更好的办法?  先谈谈需求吧以免

知识大全 php设计模式之观察者模式的应用详解

 代码如下:<?php//抽象主题interfaceSubjectpublicfunctionattach($observer);publicfunctiondetach($obser

知识大全 .net设计模式之观察者模式

  故事    小雪是一个非常漂亮的女孩漂亮的女孩总是有很多的追求者而且追求者的队伍在不断的变动随时有人进入这个队伍也有人退出男孩们追求女孩时总是表现出%的关心当小雪私自游玩时总是不断收到追求者询问小

知识大全 Java程序性能优化-观察者模式(3)

Java程序性能优化-观察者模式(3)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!   

知识大全 Java程序性能优化-观察者模式(2)[2]

Java程序性能优化-观察者模式(2)[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  图&

知识大全 Java程序性能优化-观察者模式(1)[2]

Java程序性能优化-观察者模式(1)[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  pu