<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                26.2 狀態模式的定義 上面的例子中多次提到狀態,本節講的就是狀態模式,什么是狀態模式呢?其定義如下: Allow an object to alter its behavior when its internal state changes.The object will appear to change its class.(當一個對象內在狀態改變時允許其改變行為,這個對象看起來像改變了其類。) 狀態模式的核心是封裝,狀態的變更引起了行為的變更,從外部看起來就好像這個對象對應的類發生了改變一樣。狀態模式的通用類圖如圖26-5所示。 ![](https://box.kancloud.cn/2016-08-14_57b0036b2631c.jpg) 圖26-5 狀態模式通用類圖 我們先來看看狀態模式中的3個角色。 ● State——抽象狀態角色 接口或抽象類,負責對象狀態定義,并且封裝環境角色以實現狀態切換。 ● ConcreteState——具體狀態角色 每一個具體狀態必須完成兩個職責:本狀態的行為管理以及趨向狀態處理,通俗地說,就是本狀態下要做的事情,以及本狀態如何過渡到其他狀態。 ● Context——環境角色 定義客戶端需要的接口,并且負責具體狀態的切換。 狀態模式相對來說比較復雜,它提供了一種對物質運動的另一個觀察視角,通過狀態變更促使行為的變化,就類似水的狀態變更一樣,一碗水的初始狀態是液態,通過加熱轉變為氣態,狀態的改變同時也引起體積的擴大,然后就產生了一個新的行為:鳴笛或頂起壺蓋,瓦特就是這么發明蒸汽機的。我們再來看看狀態模式的通用源代碼,首先來看抽象環境角色,如代碼清單26-14所示。 代碼清單26-14 抽象環境角色 public?abstract?class?State?{ ?????//定義一個環境角色,提供子類訪問 ?????protected?Context?context; ?????//設置環境角色 ?????public?void?setContext(Context?_context){ ?????????????this.context?=?_context; ?????} ?????//行為1 ?????public?abstract?void?handle1(); ?????//行為2 ?????public?abstract?void?handle2(); } 抽象環境中聲明一個環境角色,提供各個狀態類自行訪問,并且提供所有狀態的抽象行為,由各個實現類實現。具體環境角色如代碼清單26-15所示。 代碼清單26-15 環境角色 public?class?ConcreteState1?extends?State?{ ?????@Override ?????public?void?handle1()?{ ?????????????//本狀態下必須處理的邏輯 ?????} ?????@Override ?????public?void?handle2()?{ ?????????????//設置當前狀態為stat2 ?????????????super.context.setCurrentState(Context.STATE2); ?????????????//過渡到state2狀態,由Context實現 ?????????????super.context.handle2(); ?????} } public?class?ConcreteState2?extends?State?{ ?????@Override ?????public?void?handle1()?{?????????? ?????????????//設置當前狀態為state1 ?????????????super.context.setCurrentState(Context.STATE1); ?????????????//過渡到state1狀態,由Context實現 ?????????????super.context.handle1(); ?????} ?????@Override ?????public?void?handle2()?{ ?????????????//本狀態下必須處理的邏輯 ?????} } 具體環境角色有兩個職責:處理本狀態必須完成的任務,決定是否可以過渡到其他狀態。我們再來看環境角色,如代碼清單26-16所示。 代碼清單26-16 具體環境角色 public?class?Context?{ ?????//定義狀態 ?????public?final?static?State?STATE1?=?new?ConcreteState1(); ?????public?final?static?State?STATE2?=?new?ConcreteState2(); ?????//當前狀態 ?????private?State?CurrentState; ?????//獲得當前狀態 ?????public?State?getCurrentState()?{ ?????????????return?CurrentState; ?????} ?????//設置當前狀態 ?????public?void?setCurrentState(State?currentState)?{ ?????????????this.CurrentState?=?currentState; ?????????????//切換狀態 ?????????????this.CurrentState.setContext(this); ?????} ?????//行為委托 ?????public?void?handle1(){ ?????????????this.CurrentState.handle1(); ?????} ?????public?void?handle2(){ ?????????????this.CurrentState.handle2(); ?????} } 環境角色有兩個不成文的約束: ● 把狀態對象聲明為靜態常量,有幾個狀態對象就聲明幾個靜態常量。 ● 環境角色具有狀態抽象角色定義的所有行為,具體執行使用委托方式。 我們再來看場景類如何執行,如代碼清單26-17所示。 代碼清單26-17 具體環境角色 public?class?Client?{ ?????public?static?void?main(String[]?args)?{ ?????????????//定義環境角色 ?????????????Context?context?=?new?Context(); ?????????????//初始化狀態 ?????????????context.setCurrentState(new?ConcreteState1()); ?????????????//行為執行 ?????????????context.handle1(); ?????????????context.handle2(); ?????} } 看到沒?我們已經隱藏了狀態的變化過程,它的切換引起了行為的變化。對外來說,我們只看到行為的發生改變,而不用知道是狀態變化引起的。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看