亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

java設計模式之State(對應每種狀態的行為)

2019-11-18 12:15:12
字體:
來源:轉載
供稿:網友

  State的定義: 不同的狀態,不同的行為;或者說,每個狀態有著相應的行為.
  
  何時使用?
  State模式在實際使用中比較多,適合"狀態的切換".因為我們經常會使用If elseif else 進行狀態切換, 假如針對狀態的這樣判定切換反復出現,我們就要聯想到是否可以采取State模式了.
  
  不只是根據狀態,也有根據屬性.假如某個對象的屬性不同,對象的行為就不一樣,這點在數據庫系統中出現頻率比較高,我們經常會在一個數據表的尾部,加上PRoperty屬性含義的字段,用以標識記錄中一些非凡性質的記錄,這種屬性的改變(切換)又是隨時可能發生的,就有可能要使用State.
  
  是否使用?
  在實際使用,類似開關一樣的狀態切換是很多的,但有時并不是那么明顯,取決于你的經驗和對系統的理解深度.
  
  這里要闡述的是"開關切換狀態" 和" 一般的狀態判定"是有一些區別的, " 一般的狀態判定"也是有 if..elseif結構,例如:
  
      if (which==1) state="hello";
      else if (which==2) state="hi";
      else if (which==3) state="bye";
  
  這是一個 " 一般的狀態判定",state值的不同是根據which變量來決定的,which和state沒有關系.假如改成:
  
      if (state.euqals("bye")) state="hello";
      else if (state.euqals("hello")) state="hi";
      else if (state.euqals("hi")) state="bye";
  
  這就是 "開關切換狀態",是將state的狀態從"hello"切換到"hi",再切換到""bye";在切換到"hello",好象一個旋轉開關,這種狀態改變就可以使用State模式了.
  
  假如單純有上面一種將"hello"-->"hi"-->"bye"-->"hello"這一個方向切換,也不一定需要使用State模式,因為State模式會建立很多子類,復雜化,但是假如又發生另外一個行為:將上面的切換方向反過來切換,或者需要任意切換,就需要State了.
  
  請看下例:
  
  public class Context{
  
    private Color state=null;
  
    public void push(){
  
      //假如當前red狀態 就切換到blue
      if (state==Color.red) state=Color.blue;
  
      //假如當前blue狀態 就切換到green
      else if (state==Color.blue) state=Color.green;
  
      //假如當前black狀態 就切換到red
      else if (state==Color.black) state=Color.red;
  
      //假如當前green狀態 就切換到black
      else if (state==Color.green) state=Color.black;
      
      Sample sample=new Sample(state);
      sample.Operate();
    }
  
    public void pull(){
  
      //與push狀態切換正好相反
  
      if (state==Color.green) state=Color.blue;
      else if (state==Color.black) state=Color.green;
      else if (state==Color.blue) state=Color.red;
      else if (state==Color.red) state=Color.black;
  
      Sample2 sample2=new Sample2(state);
      sample2.operate();
    }
  
  }
  
  在上例中,我們有兩個動作push推和pull拉,這兩個開關動作,改變了Context顏色,至此,我們就需要使用State模式優化它.
  
  另外注重:但就上例,state的變化,只是簡單的顏色賦值,這個具體行為是很簡單的,State適合巨大的具體行為,因此在,就本例,實際使用中也不一定非要使用State模式,這會增加子類的數目,簡單的變復雜.
  
  例如: 銀行帳戶, 經常會在Open 狀態和Close狀態間轉換.
  
  例如: 經典的TcpConnection, Tcp的狀態有創建 偵聽 關閉三個,并且反復轉換,其創建 偵聽 關閉的具體行為不是簡單一兩句就能完成的,適合使用State
  
  例如:信箱POP帳號, 會有四種狀態, start HaveUsername Authorized quit,每個狀態對應的行為應該是比較大的.適合使用State
  
  例如:在工具箱挑選不同工具,可以看成在不同工具中切換,適合使用State.如 具體繪圖程序,用戶可以選擇不同工具繪制方框 直線 曲線,這種狀態切換可以使用State.
  
  如何使用?
  State需要兩種類型實體參與:
  
  1.state manager 狀態治理器 ,就是開關 ,如上面例子的Context實際就是一個state manager, 在state manager中有對狀態的切換動作.
  2.用抽象類或接口實現的父類,,不同狀態就是繼續這個父類的不同子類.
  
  以上面的Context為例.我們要修改它,建立兩個類型的實體.
  第一步: 首先建立一個父類:
  
  public abstract class State{
  
    public abstract void handlepush(Context c);
    public abstract void handlepull(Context c);
    public abstract void getcolor();
  
  }
  
  父類中的方法要對應state manager中的開關行為,在state manager中 本例就是Context中,有兩個開關動作push推和pull拉.那么在狀態父類中就要有具體處理這兩個動作:handlepush() handlepull(); 同時還需要一個獲取push或pull結果的方法getcolor()
  
  下面是具體子類的實現:
  
  public class BlueState extends State{
  
    public void handlepush(Context c){
       //根據push方法"假如是blue狀態的切換到green"
       c.setState(new GreenState());
  
    }
    public void handlepull(Context c){
  
       //根據pull方法"假如是blue狀態的切換到red"
      c.setState(new RedState());
  
    }
  
    public abstract void getcolor(){ return (Color.blue)}
  
  }
  
  同樣 其他狀態的子類實現如blue一樣.
  
  第二步: 要重新改寫State manager 也就是本例的Context:
  
  public class Context{
  
    private Sate state=null; //我們將原來的 Color state 改成了新建的State state;
  
    //setState是用來改變state的狀態 使用setState實現狀態的切換
    pulic void setState(State state){
  
      this.state=state;
  
    }
  
    public void push(){
  
      //狀態的切換的細節部分,在本例中是顏色的變化,已經封裝在子類的handlepush中實現,這里無需關心
      state.handlepush(this);
      
      //因為sample要使用state中的一個切換結果,使用getColor()
      Sample sample=new Sample(state.getColor());
      sample.operate();
  
    }
  
    public void pull(){
  
      state.handlepull(this);
      
      Sample2 sample2=new Sample2(state.getColor());
      sample2.operate();
  
    }
  
  }
  
  至此,我們也就實現了State的refactorying過程.
  
  以上只是相當簡單的一個實例,在實際應用中,handlepush或handelpull的處理是復雜的.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美肥臀大乳一区二区免费视频| 欧美在线视频免费播放| 国产精品日韩在线播放| 欧美在线亚洲在线| 国产一区二区三区高清在线观看| 亚洲国模精品私拍| 日韩av影院在线观看| 亚洲人在线视频| 亚洲视频国产视频| 国产精品久久久久久久美男| 日韩hd视频在线观看| 欧美日韩国产麻豆| 亚洲一区二区三区成人在线视频精品| 亚洲va码欧洲m码| 高清视频欧美一级| 日韩三级影视基地| 91在线免费看网站| 亚洲福利视频在线| 国产日韩欧美视频在线| 久久人人爽人人爽人人片av高清| 一本大道亚洲视频| 亚洲免费电影一区| 欧美裸体xxxx| 中文字幕综合在线| 91精品免费久久久久久久久| 精品一区二区亚洲| 黑人精品xxx一区一二区| 日韩hd视频在线观看| 亚洲精品视频在线观看视频| 国产亚洲欧美日韩精品| 欧美黄色小视频| 日本精品中文字幕| 亚洲视频在线观看| 成人妇女淫片aaaa视频| 精品久久久久久久久久国产| 亚洲精品按摩视频| 日韩视频―中文字幕| 精品视频在线播放| 一区二区三区四区在线观看视频| 欧美性jizz18性欧美| 日韩免费看的电影电视剧大全| 久久久www成人免费精品| 国产一区av在线| 亚洲欧美在线免费| 国产精品吊钟奶在线| 日韩中文视频免费在线观看| 久热在线中文字幕色999舞| 国产精品免费看久久久香蕉| 亚洲男人av电影| 国产精品日韩久久久久| 日韩欧美成人网| 欧美www在线| 一区二区三区精品99久久| 日韩欧中文字幕| 17婷婷久久www| 成人福利网站在线观看11| 中文字幕亚洲欧美日韩高清| 亚洲奶大毛多的老太婆| 国产视频精品xxxx| 欧美激情二区三区| 久久理论片午夜琪琪电影网| 精品久久久免费| 在线观看国产成人av片| 国产精品av电影| 九九热这里只有在线精品视| 日韩黄在线观看| 2019中文字幕在线观看| 久久久国产精品亚洲一区| 成人黄色免费在线观看| 日韩av在线免播放器| 亚洲人成电影网站色| 国产日韩中文在线| 欧美国产精品人人做人人爱| 日韩av高清不卡| 亚洲女同精品视频| 欧美精品性视频| 欧美www视频在线观看| 国外成人在线视频| 国产精品一久久香蕉国产线看观看| 欧美福利视频在线观看| 欧美大片欧美激情性色a∨久久| 69久久夜色精品国产69乱青草| 国产精品成人观看视频国产奇米| 欧美精品国产精品日韩精品| 日本国产精品视频| 亚洲国产精彩中文乱码av| 国产香蕉精品视频一区二区三区| 2019亚洲男人天堂| 色综合久久精品亚洲国产| 欧美性猛xxx| 97在线观看免费高清| 一区二区三区四区精品| 国产精品成熟老女人| 亚洲天堂第二页| 日韩免费黄色av| 九九久久精品一区| 亚洲精品美女久久久久| 在线观看精品自拍私拍| 亚洲精品按摩视频| 正在播放欧美视频| 亚洲色图av在线| 国产精品久久久久久久av大片| 97香蕉超级碰碰久久免费的优势| 成人欧美在线视频| 久久久久久91香蕉国产| 欧美在线视频观看免费网站| 日韩欧美一区二区三区久久| 久久精品国产v日韩v亚洲| 日韩精品中文字幕久久臀| 国产亚洲欧美日韩美女| 亚洲精品成a人在线观看| 成人欧美一区二区三区黑人| 在线观看欧美视频| 久久久成人精品| 欧美国产日韩一区二区| 精品日本美女福利在线观看| 欧美精品激情在线观看| 亚洲精品美女免费| 国产区亚洲区欧美区| 一区二区三区无码高清视频| 国产欧美精品xxxx另类| 国产91网红主播在线观看| 黑人狂躁日本妞一区二区三区| 久久久久久久久中文字幕| 国产精品视频免费在线观看| 国产日韩在线播放| 国产精品欧美日韩一区二区| 亚洲精选在线观看| 爽爽爽爽爽爽爽成人免费观看| 成人在线激情视频| 一区二区在线视频| 亚洲大胆人体av| 久久久久久亚洲精品中文字幕| 中文字幕一区日韩电影| 黑人巨大精品欧美一区二区三区| 日韩av片免费在线观看| 亚洲精品成人久久久| 欧美日韩另类在线| 久久精品青青大伊人av| 欧美日韩免费区域视频在线观看| xvideos成人免费中文版| 亚洲黄色有码视频| 日韩精品中文字幕有码专区| 亚洲精品国产精品乱码不99按摩| 伊人成人开心激情综合网| 欧美精品电影免费在线观看| 日本亚洲欧美成人| 欧美日韩一区二区在线播放| 俺去亚洲欧洲欧美日韩| xx视频.9999.com| 中国人与牲禽动交精品| 久久综合伊人77777蜜臀| 成人性生交大片免费看小说| 亚洲最大激情中文字幕| 国产精品美女久久久久久免费| 欧美黄色片免费观看| 国产91成人在在线播放| 亚洲欧美在线磁力| 亚洲永久免费观看| 欧美日本亚洲视频| 国产午夜精品免费一区二区三区| 亚洲第一天堂av| 久久久久久噜噜噜久久久精品| 欧美超级乱淫片喷水|