程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java設計形式之狀況形式(State形式)引見

Java設計形式之狀況形式(State形式)引見

編輯:關於JAVA

Java設計形式之狀況形式(State形式)引見。本站提示廣大學習愛好者:(Java設計形式之狀況形式(State形式)引見)文章只能為提供參考,不一定能成為您想要的結果。以下是Java設計形式之狀況形式(State形式)引見正文


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:

ublic 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的處置是龐雜的。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved