熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java高級技術 >> 正文

聖斗士星矢的狀態模式和觀察者模式

2022-06-13   來源: Java高級技術 

  星矢動畫片《聖斗士星矢》的男豬腳超級小強怎麼打也打不死

  雅典娜動畫片《聖斗士星矢》的女豬腳自稱女神手下有個男人為他賣命

  狀態模式為了方便的控制狀態的變化避免一堆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(){
  //調用當前狀態的被打方法 反過來改變自己的狀態
  statehit();
  }
  public String status(){
  //當前狀態名
  return statestatus();
  }
  protected void setState(SaiyaState state){
  laststate=thisstate;
  thisstate=state;
  //觀察者模式
  setChanged();
  notifyObservers(星矢狀態變化);
  }
  public String getlastStatus(){
  return laststatestatus();
  }
  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(){
  //調用當前狀態的被打方法 反過來改變自己的狀態
  statehit();
  }
  public String status(){
  //當前狀態名
  return statestatus();
  }
  protected void setState(SaiyaState state){
  laststate=thisstate;
  thisstate=state;
  //觀察者模式
  setChanged();
  notifyObservers(星矢狀態變化);
  }
  public String getlastStatus(){
  return laststatestatus();
  }

  星矢的狀態

  Java代碼 

  
public abstract class SaiyaState {
  protected Saiya saiya;
  public SaiyaState(Saiya saiya) {
  thissaiya = saiya;
  }
  public String status(){
  String name=getClass()getName();
  return namesubstring(namelastIndexOf()+);
  }
  //星矢被打了
  public abstract void hit();
  }
  public abstract class SaiyaState {
  protected Saiya saiya;
  public SaiyaState(Saiya saiya) {
  thissaiya = saiya;
  }
  public String status(){
  String name=getClass()getName();
  return namesubstring(namelastIndexOf()+);
  }
  //星矢被打了
  public abstract void hit();
  }

  在每種狀態裡面實現被打的時候所需要更改的狀態例如小宇宙爆發狀態下被打

  Java代碼

   public class UniverseState extends SaiyaState {
  /**
  * @param saiya
  */
  public UniverseState(Saiya saiya) {
  super(saiya);
  }
  /* 小宇宙爆發狀態被打進入瀕死狀態
  *
  */
  public void hit() {
  saiyasetState( saiyaDYING);
  }
  }
  public class UniverseState extends SaiyaState {
  /**
  * @param saiya
  */
  public UniverseState(Saiya saiya) {
  super(saiya);
  }
  /* 小宇宙爆發狀態被打進入瀕死狀態
  *
  */
  public void hit() {
  saiyasetState( saiyaDYING);
  }
  }

  雅典娜在一邊看星矢每次被打她都要給星矢加油她是個觀察者星矢是被觀察者這裡星矢實現javautilObservable每次被打hit就notifyObservers雅典娜就加油

  Java代碼 

   public class Athena implements Observer {
  /* 我是雅典娜 我是觀察者
  *
  */
  public void update(Observable arg Object arg) {
  Systemoutprintln(雅典娜說星矢加油啊!!!);
  }
  }
  public class Athena implements Observer {
  /* 我是雅典娜 我是觀察者
  *
  */
  public void update(Observable arg Object arg) {
  Systemoutprintln(雅典娜說星矢加油啊!!!);
  }
  }

  總的來看 這個過程就是這樣子

  Java代碼

   public class StateMain {
  public static void main(String[] args) {
  Saiya saiya = new Saiya();
  Observer athena = new Athena();
  saiyaaddObserver(athena);
  Systemoutprintln(星矢最初的狀態是 + saiyastatus());
  for (int i = ; i < ; i++) {
  Systemoutprintln(星矢被揍了 + (i + ) + );
  saiyahit();
  Systemoutprintln(星矢現在的狀態是 + saiyastatus());
  }
  }
  }
  public class StateMain {
  public static void main(String[] args) {
  Saiya saiya = new Saiya();
  Observer athena = new Athena();
  saiyaaddObserver(athena);
  Systemoutprintln(星矢最初的狀態是 + saiyastatus());
  for (int i = ; i < ; i++) {
  Systemoutprintln(星矢被揍了 + (i + ) + );
  saiyahit();
  Systemoutprintln(星矢現在的狀態是 + saiyastatus());
  }
  }
  }

  結果星矢在雅典娜的幫助下有驚無險的戰勝了很強的某斗士甲

  Java代碼

  星矢最初的狀態是NormalState

  星矢被揍了

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

  星矢現在的狀態是DyingState

  星矢被揍了

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

  星矢現在的狀態是UniverseState

  星矢被揍了

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

  星矢現在的狀態是DyingState

  星矢被揍了

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

  星矢現在的狀態是GoddessState

  星矢被揍了

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

  星矢現在的狀態是NormalState

  星矢最初的狀態是NormalState

  星矢被揍了

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

  星矢現在的狀態是DyingState

  星矢被揍了

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

  星矢現在的狀態是UniverseState

  星矢被揍了

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

  星矢現在的狀態是DyingState

  星矢被揍了

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

  星矢現在的狀態是GoddessState

  星矢被揍了

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

  星矢現在的狀態是NormalState

  總結狀態模式的缺點就是會弄出很多子類如果狀態沒那麼復雜狀態規則改變的可能性比較小的話就不要用了


From:http://tw.wingwit.com/Article/program/Java/gj/201311/27341.html
    相關文章
      没有相关文章
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.