<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國際加速解決方案。 廣告
                18.2 策略模式的定義 策略模式(Strategy Pattern)是一種比較簡單的模式,也叫做政策模式(Policy Pattern)。其定義如下: Define a family of algorithms,encapsulate each one,and make them interchangeable.(定義一組算法,將每個算法都封裝起來,并且使它們之間可以互換。) 這個定義是非常明確、清晰的,“定義一組算法”,看看我們的三個計謀是不是三個算法?“將每個算法都封裝起來”,封裝類Context不就是這個作用嗎?“使它們可以互換”當然可以互換了,都實現是相同的接口,那當然可以相互轉化了。我們看看策略模式的通用類圖,如圖18-3所示。 ![](https://box.kancloud.cn/2016-08-14_57b00365cb142.jpg) 圖18-3 策略模式通用類圖 策略模式使用的就是面向對象的繼承和多態機制,非常容易理解和掌握,我們再來看看策略模式的三個角色: ● Context封裝角色 它也叫做上下文角色,起承上啟下封裝作用,屏蔽高層模塊對策略、算法的直接訪問,封裝可能存在的變化。 ● Strategy抽象策略角色 策略、算法家族的抽象,通常為接口,定義每個策略或算法必須具有的方法和屬性。各位看官可能要問了,類圖中的AlgorithmInterface是什么意思,嘿嘿,algorithm是“運算法則”的意思,結合起來意思就明白了吧。 ● ConcreteStrategy具體策略角色 實現抽象策略中的操作,該類含有具體的算法。 我們再來看策略模式的通用源碼,非常簡單。先看抽象策略角色,它是一個非常普通的接口,在我們的項目中就是一個普通得不能再普通的接口了,定義一個或多個具體的算法,如代碼清單18-7所示。 代碼清單18-7 抽象的策略角色 public?interface?Strategy?{ ?????//策略模式的運算法則 ?????public?void?doSomething(); } 具體策略也是非常普通的一個實現類,只要實現接口中的方法就可以,如代碼清單18-8所示。 代碼清單18-8 具體策略角色 public?class?ConcreteStrategy1?implements?Strategy?{ ?????public?void?doSomething()?{ ?????????????System.out.println("具體策略1的運算法則"); ?????} } public?class?ConcreteStrategy2?implements?Strategy?{ ?????public?void?doSomething()?{ ?????????????System.out.println("具體策略2的運算法則"); ?????} } 策略模式的重點就是封裝角色,它是借用了代理模式的思路,大家可以想想,它和代理模式有什么差別,差別就是策略模式的封裝角色和被封裝的策略類不用是同一個接口,如果是同一個接口那就成為了代理模式。我們來看封裝角色,如代碼清單18-9所示。 代碼清單18-9 封裝角色 public?class?Context?{ ?????//抽象策略 ?????private?Strategy?strategy?=?null;?? ?????//構造函數設置具體策略 ?????public?Context(Strategy?_strategy){ ?????????????this.strategy?=?_strategy; ?????} ?????//封裝后的策略方法 ?????public?void?doAnythinig(){ ?????????????this.strategy.doSomething(); ?????} } 高層模塊的調用非常簡單,知道要用哪個策略,產生出它的對象,然后放到封裝角色中就完成任務了,如代碼清單18-10所示。 代碼清單18-10 高層模塊 public?class?Client?{ ?????public?static?void?main(String[]?args)?{ ?????????????//聲明一個具體的策略 ?????????????Strategy?strategy?=?new?ConcreteStrategy1(); ?????????????//聲明上下文對象 ?????????????Context?context?=?new?Context(strategy); ?????????????//執行封裝后的方法 ?????????????context.doAnythinig(); ?????} } 策略模式就是這么簡單,偷著樂吧,它就是采用了面向對象的繼承和多態機制,其他沒什么玄機。想想看,你真實的業務環境有這么簡單嗎?一個類實現多個接口很正常,你要有火眼金睛看清楚哪個接口是抽象策略接口,哪些是和策略模式沒有任何關系,這就是你作為系統分析師的價值所在。
                  <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>

                              哎呀哎呀视频在线观看