策略模式實現方式
a) 提供公共接口或抽象類,定義需要使用的策略方法。(策略抽象類)
b) 多個實現的策略抽象類的實現類。(策略實現類)
c) 環境類,對多個實現類的封裝,提供接口類型的成員量,可以在客戶端中切換。
d) 客戶端 調用環境類 進行不同策略的切換。
策略模式的優點
1、策略模式提供了管理相關的算法族的辦法。策略類的等級結構定義了一個算法或行為族。恰當使用繼承可以把公共的代碼移到父類里面,從而避免代碼重復。
2、使用策略模式可以避免使用多重條件(if-else)語句。多重條件語句不易維護,它把采取哪一種算法或采取哪一種行為的邏輯與算法或行為的邏輯混合在一起,統統列在一個多重條件語句里面,比使用繼承的
辦法還要原始和落后。
策略模式的缺點
1、客戶端必須知道所有的策略類,並自行決定使用哪一個策略類。這就意味着客戶端必須理解這些算法的區別,以便適時選擇恰當的算法類。換言之,策略模式只適用於客戶端知道算法或行為的情況。
2、由於策略模式把每個具體的策略實現都單獨封裝成為類,如果備選的策略很多的話,那么對象的數目就會很可觀。
實現例子如下:
1 using System; 2 using System.Collections.Generic; 3 using System.Text; 4 5 namespace ConsoleApp1 6 { 7 /// <summary> 8 /// 算法基類 9 /// </summary> 10 public class arithmetic 11 { 12 public int A { get; set; } 13 14 public int B { get; set; } 15 16 public virtual int operation() 17 { 18 return 0; 19 } 20 } 21 22 /// <summary> 23 /// 加法 24 /// </summary> 25 public class arithmeticAdd : arithmetic 26 { 27 public override int operation() 28 { 29 return A + B; 30 31 } 32 } 33 34 /// <summary> 35 /// 減法 36 /// </summary> 37 public class arithmeticSubtraction : arithmetic 38 { 39 public override int operation() 40 { 41 return A - B; 42 } 43 } 44 45 /// <summary> 46 /// 策略類 47 /// </summary> 48 public class context 49 { 50 private arithmetic op; 51 public context(string type) 52 { 53 switch (type) 54 { 55 case "+": { op = new arithmeticAdd(); };break; 56 case "-": { op = new arithmeticSubtraction(); }; break; 57 } 58 } 59 60 public int getResult() 61 { 62 return op.operation(); 63 } 64 } 65 66 }