Strategy--策略模式_第1頁
Strategy--策略模式_第2頁
Strategy--策略模式_第3頁
Strategy--策略模式_第4頁
Strategy--策略模式_第5頁
全文預覽已結束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、strategy-策略模式the strategy pattern defines a family of algorithms,encapsulates each one,a nd makes them interchangeable. strategy lets the algorithm vary independently from clients that use it.策略模式定義了一系列的算法,并將每一個算法封裝起來,而幾使它們還對以相互替換。 策略模式讓算法獨立于使用它的客八而獨立變化。前提:首先我們需要理解三個設計原則一:ldentify the aspects of you

2、r application that vary and separate them from what stays the same.俄到系統(tǒng)中變化的部分,將變化的部分同其它穩(wěn)定的部分隔開。)二:program to an in terface, not an implementati on.(血向接口編程,而不要血向 實現(xiàn)編程。)h:favor composition over inheritance.(優(yōu)先使用對彖組合,而非類繼承) 下面是策略模式的類圖.context(應用場景): 需耍使用concretestrategy提供的算法。 內部維護一個strategy的實例。 負責動態(tài)設置運

3、行時strategy具體的實現(xiàn)算法。 負責跟strategy z間的交互和數(shù)據(jù)傳遞。strategy(抽象策略類):定義了一個公共接口,各種不同的算法以不同的方式實現(xiàn)這個接口,context使川這個接口調用不同的算法,一般使用接口或抽彖類實現(xiàn)。concretestrategy(具體策略類):實現(xiàn)了 strategy定義的接口,提供具體的算法實現(xiàn)。如圖:context是程序上下文,在context中需要使用concretestrategy方法.可是這個方 法實現(xiàn)是變化的程序需要針對不同的客戶需求決定不同的程序實現(xiàn).為了不因為每一個需求去重寫context .我們可以抽象concretestrat

4、egy方法讓它成為 一個接口,由不同的實現(xiàn)類實現(xiàn)該接口 (是的這些類是描述行為的)同時我們在context類中將concretestrategy方法聲明為屬性.這樣我們就可以在程序運行吋動態(tài)的決定concretestrategy方法的實現(xiàn)了.程序模擬:應用場景和優(yōu)缺點上血我們已經(jīng)看過了 strategy模式的詳細介紹,下血我們再來簡單說說這個模式的優(yōu)缺點 吧!怎么說呢,人無完人,設計模式也不是萬能的,每一個模式都冇它的使命,也就是說只冇在 特定的場景下才能發(fā)揮其功效。我們要使用好模式,就必須熟知各個模式的應用場景。對于strategy模式來說,主要有這些應用場景:仁 多個類只區(qū)別在表現(xiàn)行為不同

5、,可以使用strategy模式,在運行時動態(tài)選擇具體要執(zhí) 行的行為。(例如 flybehavior 和 quackbehavior)2、需耍在不同情況下使川不同的策略(算法),或者策略還可能在未來川莫它方式來實現(xiàn)。 (例如flybehavior和quackbehavior的具體實現(xiàn)可任意變化或擴充)3、對客戶(duck)隱藏具體策略(算法)的實現(xiàn)細節(jié),彼此完全獨立。對于strategy模式來說,主要有如下優(yōu)點:1、提供了一種替代繼承的方法,而且既保持了繼承的優(yōu)點(代碼重川)還比繼承更靈活(算 法獨立,可以任意擴展)。2、避免程序屮使用多重條件轉移語句,使系統(tǒng)更靈活,并易于擴展。3、遵守大部分g

6、rasp原則和常用設計原則,高內聚、低偶合。對于strategy模式來說,主要有如下缺點:1、因為每個具體策略類都會產(chǎn)生一個新類,所以會增加系統(tǒng)需要維護的類的數(shù)量。附:.net框架里的應用strategy模式的應用非常廣泛,也許大家有意無意之間一直都在使用。這里舉一個.net框 架里使用strategy模式的例了,象這樣的例了其實還冇很多,只要大家細心體會就一定會發(fā)現(xiàn) 的。如果寫過程序,那么arraylist類肯定祁會用過吧,那么它的sort方法想必大家也一定不陌 生了。sort方法的定義如下:public virtual void sort (icomparer comparer)j以看到s

7、ort方法接收一個icomparer類型的參數(shù),那么這個icomparer接口是做什么 用的呢?下面我們看一段程序,下面的代碼示例演示如何使用默認比較器和一個反轉排序順序的 自定義比較器,對arraylist中的值進行排序。(完全引自msdn : ms-help:/ms.msdnqtr.v80.chs/ms.msdn.v80/ms.netdevfx.v20.chs/cpref2/html/m_sys tern collections arraylist sort 1 a2d90598.htm)1 using system;2 using system.collections;34曰public

8、 class samplesarraylist 5 i6二 public class myreverserclass : icomparer 7 i8 i / calls caselnsensitivecomparer.compare with the parameters reversed.9二 int icomparer.compare( object x, object y ) 10 i return( (new caselnsensitivecomparer().compare( y, x );11h 1213 i- 15申 public static void main() 16 i

9、17 i / creates and initializes a new arraylist.18 i arraylist myal = new arraylist();19 imyal.add(”the”);20 imyal.add( "quick");21 imyal.add( "brown");22 imyal.add( "fox“);23 imyal.add( "jumps");24 imyal.add( "over");25 imyal.add(”the");26 imyal.add(

10、 'lazy,);27 imyal.add( "dog11);28 i29 / displays the values of the arraylist.30 i console.writeline( "the arraylist initially contains the following values:");31 i printlndexandvalues( myal );32 i33 i / sorts the values of the arraylist using the default comparer.341myal.sort();35

11、 i console.writeline( "after sorting with the default comparer:*1);36 iprintlndexandvalues( myal );37 i38 i/ sorts the values of the arraylist usingthereverse case-insensitive comparer.39 iicomparer mycomparer = new myreverserclass();40 imyal.sort( mycomparer);41 i console.writeline( "afte

12、r sorting with the reverse case-insensitive comparer:");42 iprintlndexandvalues( myal );43 i44 k 45 i46p public static void printlndexandvalues( enumerable mylist) 47 i inti = 0;48 i foreach ( object obj in mylist)49 i console.writeline( ht0:t1n, i+, obj);50 iconsole.writeline();51 i- 52545556%

13、57 i this code produces the following output.58 i the arraylist initially contains the following values:59 11 0:1the60 11:llquick61 i1 2:1brow n62 iiii 3:iifox63 i1:lljumps64 11:llover65 11:the66 11:lazy67 11 8:lldog68 1169 1after sorting with the default comparer:70 11 0:brown71 11:lldog72 11 2:fox

14、73 1i 3:iijumps74 11:1lazy75 11:over76 11:quick77 1:the78 11 8:the79 1180 11after sortlling with the reverse case-insensitive comparer:811 0:the82 i1 1:llthe83 1i 2:quick84 1i3:over85 1i:1lazy86 11:lljumps871:fox88 1i 7:iidog89 11 8:brow n90 l7怎么樣,大家看出來了吧,其實在這段代碼里,arraylist相當于strategy模式中的 context(應用場景)部分,而icomparer相當于strategy(抽彖策略類)部分,myreverserclass 相當v concretestrategy(具體策略類)部分。我們這里拋開myreverserclass類的compare方法 如何具體實現(xiàn)不談,我們只要知道這是一個具體策略

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論