<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>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 處理對象的多種狀態及其相互轉換——狀態模式(二) 2 狀態模式概述 狀態模式用于解決系統中復雜對象的狀態轉換以及不同狀態下行為的封裝問題。當系統中某個對象存在多個狀態,這些狀態之間可以進行轉換,而且對象在不同狀態下行為不相同時可以使用狀態模式。狀態模式將一個對象的狀態從該對象中分離出來,封裝到專門的狀態類中,使得對象狀態可以靈活變化,對于客戶端而言,無須關心對象狀態的轉換以及對象所處的當前狀態,無論對于何種狀態的對象,客戶端都可以一致處理。 狀態模式定義如下: 狀態模式(State Pattern):允許一個對象在其內部狀態改變時改變它的行為,對象看起來似乎修改了它的類。其別名為狀態對象(Objects for States),狀態模式是一種對象行為型模式。 在狀態模式中引入了抽象狀態類和具體狀態類,它們是狀態模式的核心,其結構如圖3所示: ![](http://img.my.csdn.net/uploads/201301/20/1358693242_5100.jpg) 圖3 狀態模式結構圖 在狀態模式結構圖中包含如下幾個角色: ● Context(環境類):環境類又稱為上下文類,它是擁有多種狀態的對象。由于環境類的狀態存在多樣性且在不同狀態下對象的行為有所不同,因此將狀態獨立出去形成單獨的狀態類。在環境類中維護一個抽象狀態類State的實例,這個實例定義當前狀態,在具體實現時,它是一個State子類的對象。 ● State(抽象狀態類):它用于定義一個接口以封裝與環境類的一個特定狀態相關的行為,在抽象狀態類中聲明了各種不同狀態對應的方法,而在其子類中實現類這些方法,由于不同狀態下對象的行為可能不同,因此在不同子類中方法的實現可能存在不同,相同的方法可以寫在抽象狀態類中。 ● ConcreteState(具體狀態類):它是抽象狀態類的子類,每一個子類實現一個與環境類的一個狀態相關的行為,每一個具體狀態類對應環境的一個具體狀態,不同的具體狀態類其行為有所不同。 在狀態模式中,我們將對象在不同狀態下的行為封裝到不同的狀態類中,為了讓系統具有更好的靈活性和可擴展性,同時對各狀態下的共有行為進行封裝,我們需要對狀態進行抽象,引入了抽象狀態類角色,其典型代碼如下所示: ``` abstract class State { //聲明抽象業務方法,不同的具體狀態類可以不同的實現 public abstract void handle(); } ``` 在抽象狀態類的子類即具體狀態類中實現了在抽象狀態類中聲明的業務方法,不同的具體狀態類可以提供完全不同的方法實現,在實際使用時,在一個狀態類中可能包含多個業務方法,如果在具體狀態類中某些業務方法的實現完全相同,可以將這些方法移至抽象狀態類,實現代碼的復用,典型的具體狀態類代碼如下所示: ``` class ConcreteState extends State { public void handle() { //方法具體實現代碼 } } ``` 環境類維持一個對抽象狀態類的引用,通過setState()方法可以向環境類注入不同的狀態對象,再在環境類的業務方法中調用狀態對象的方法,典型代碼如下所示: ``` class Context { private State state; //維持一個對抽象狀態對象的引用 private int value; //其他屬性值,該屬性值的變化可能會導致對象狀態發生變化 //設置狀態對象 public void setState(State state) { this.state = state; } public void request() { //其他代碼 state.handle(); //調用狀態對象的業務方法 //其他代碼 } } ``` 環境類實際上是真正擁有狀態的對象,我們只是將環境類中與狀態有關的代碼提取出來封裝到專門的狀態類中。在狀態模式結構圖中,環境類Context與抽象狀態類State之間存在單向關聯關系,在Context中定義了一個State對象。在實際使用時,它們之間可能存在更為復雜的關系,State與Context之間可能也存在依賴或者關聯關系。 在狀態模式的使用過程中,一個對象的狀態之間還可以進行相互轉換,通常有兩種實現狀態轉換的方式: (1) 統一由環境類來負責狀態之間的轉換,此時,環境類還充當了狀態管理器(State Manager)角色,在環境類的業務方法中通過對某些屬性值的判斷實現狀態轉換,還可以提供一個專門的方法用于實現屬性判斷和狀態轉換,如下代碼片段所示: ``` …… public void changeState() { //判斷屬性值,根據屬性值進行狀態轉換 if (value == 0) { this.setState(new ConcreteStateA()); } else if (value == 1) { this.setState(new ConcreteStateB()); } ...... } …… ``` (2) 由具體狀態類來負責狀態之間的轉換,可以在具體狀態類的業務方法中判斷環境類的某些屬性值再根據情況為環境類設置新的狀態對象,實現狀態轉換,同樣,也可以提供一個專門的方法來負責屬性值的判斷和狀態轉換。此時,狀態類與環境類之間就將存在依賴或關聯關系,因為狀態類需要訪問環境類中的屬性值,如下代碼片段所示: ``` …… public void changeState(Context ctx) { //根據環境對象中的屬性值進行狀態轉換 if (ctx.getValue() == 1) { ctx.setState(new ConcreteStateB()); } else if (ctx.getValue() == 2) { ctx.setState(new ConcreteStateC()); } ...... } …… ``` 思考 > 理解兩種狀態轉換方式的異同?
                  <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>

                              哎呀哎呀视频在线观看