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

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 算法的封裝與切換——策略模式(二) 24.2 策略模式概述 在策略模式中,我們可以定義一些獨立的類來封裝不同的算法,每一個類封裝一種具體的算法,在這里,每一個封裝算法的類我們都可以稱之為一種策略(Strategy),為了保證這些策略在使用時具有一致性,一般會提供一個抽象的策略類來做規則的定義,而每種算法則對應于一個具體策略類。 策略模式的主要目的是將算法的定義與使用分開,也就是將算法的行為和環境分開,將算法的定義放在專門的策略類中,每一個策略類封裝了一種實現算法,使用算法的環境類針對抽象策略類進行編程,符合“依賴倒轉原則”。在出現新的算法時,只需要增加一個新的實現了抽象策略類的具體策略類即可。策略模式定義如下: 策略模式(Strategy Pattern):定義一系列算法類,將每一個算法封裝起來,并讓它們可以相互替換,策略模式讓算法獨立于使用它的客戶而變化,也稱為政策模式(Policy)。策略模式是一種對象行為型模式。 策略模式結構并不復雜,但我們需要理解其中環境類Context的作用,其結構如圖24-1所示: ![](http://my.csdn.net/uploads/201208/01/1343811032_3729.jpg) 在策略模式結構圖中包含如下幾個角色: ● Context(環境類):環境類是使用算法的角色,它在解決某個問題(即實現某個方法)時可以采用多種策略。在環境類中維持一個對抽象策略類的引用實例,用于定義所采用的策略。 ● Strategy(抽象策略類):它為所支持的算法聲明了抽象方法,是所有策略類的父類,它可以是抽象類或具體類,也可以是接口。環境類通過抽象策略類中聲明的方法在運行時調用具體策略類中實現的算法。 ● ConcreteStrategy(具體策略類):它實現了在抽象策略類中聲明的算法,在運行時,具體策略類將覆蓋在環境類中定義的抽象策略類對象,使用一種具體的算法實現某個業務處理。 **思考** 一個環境類Context能否對應多個不同的策略等級結構?如何設計? 策略模式是一個比較容易理解和使用的設計模式,策略模式是對算法的封裝,它把算法的責任和算法本身分割開,委派給不同的對象管理。策略模式通常把一個系列的算法封裝到一系列具體策略類里面,作為抽象策略類的子類。在策略模式中,對環境類和抽象策略類的理解非常重要,環境類是需要使用算法的類。在一個系統中可以存在多個環境類,它們可能需要重用一些相同的算法。 在使用策略模式時,我們需要將算法從Context類中提取出來,首先應該創建一個抽象策略類,其典型代碼如下所示: ``` abstract class AbstractStrategy { public abstract void algorithm(); //聲明抽象算法 } ``` 然后再將封裝每一種具體算法的類作為該抽象策略類的子類,如下代碼所示: ``` class ConcreteStrategyA extends AbstractStrategy { //算法的具體實現 public void algorithm() { //算法A } } ``` 其他具體策略類與之類似,對于Context類而言,在它與抽象策略類之間建立一個關聯關系,其典型代碼如下所示: ``` class Context { private AbstractStrategy strategy; //維持一個對抽象策略類的引用 public void setStrategy(AbstractStrategy strategy) { this.strategy= strategy; } //調用策略類中的算法 public void algorithm() { strategy.algorithm(); } } ``` 在Context類中定義一個AbstractStrategy類型的對象strategy,通過注入的方式在客戶端傳入一個具體策略對象,客戶端代碼片段如下所示: ``` …… Context context = new Context(); AbstractStrategy strategy; strategy = new ConcreteStrategyA(); //可在運行時指定類型 context.setStrategy(strategy); context.algorithm(); …… ``` 在客戶端代碼中只需注入一個具體策略對象,可以將具體策略類類名存儲在配置文件中,通過反射來動態創建具體策略對象,從而使得用戶可以靈活地更換具體策略類,增加新的具體策略類也很方便。策略模式提供了一種可插入式(Pluggable)算法的實現方案。
                  <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>

                              哎呀哎呀视频在线观看