首页 | 互联网 | IT动态 | IT培训 | Cisco | Windows | Linux | Java | .Net | Oracle | 软件测试 | C/C++ | 嵌入式开发 | 存储世界 | 服务器
网络设备 | IDC | 安全 | 求职招聘 | 数字网校 | 笔记本电脑 | 北大青鸟 | 技术专题 | 电子书下载 | 教学视频 | 源码下载 | 搜索 | 博客 | 论坛
中国IT实验室Linux频道
中国IT教育
Google
首页 资讯动态 认证考试 新手入门 核心技术 高级技术 J2EE J2ME Java&XML 开源技术 其他技术 RSS订阅 论坛 专题
您现在的位置: 中国IT实验室 >> Java >> 高级技术 >> 设计模式 >> 正文

圣斗士星矢的状态模式和观察者模式

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

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

  状态模式:为了方便的控制状态的变化,避免一堆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();
  }

[1] [2] [3] [4] 下一页

【责编:Chuan】

中国IT教育

相关产品和培训
文章评论
 友情推荐链接
 认证培训
 专题推荐

 ·算法分析与设计之五大常用算法
 ·开发必备 漫谈Java加密保护
 ·嵌入式开发--ARM技术专题
 ·C/C++指针,认真了解,灵活运用
 ·.NET开发:C#实用基础教程
 ·软件测试工具QTP学习专题
 ·嵌入式开发单片机解决方案专题
 ·Java开发环境 Greenfoot 程序员手册
 ·C++对象布局及多态实现的探索
 ·常见排序算法的实现
 今日更新
 社区讨论
 博客论点
 频道精选
 Java 频道导航