索引
- Policy
定義一系列的算法,把它們一個個封裝起來,并且使它們可以相互替換。使得算法可獨立于使用它的客戶而變化。
Define a family of algorithms, encapsulate each one, and make them interchangeable.
Strategy lets the algorithm vary independently from clients that use it.
Strategy
- 定義所有支持的算法的公共接口。Context 使用這個接口來調用 ConcreteStrategy 定義的算法。
ConcreteStrategy
- 實現 Strategy 接口和具體算法。
Context
- 用一個 ConcreteStrategy 對象來配置。
- 維護一個對 Strategy 對象的引用。
- 可定義一個接口來讓 Strategy 訪問它的數據。
在以下情況下可以使用 Strategy 模式:
- 許多相關的類僅僅是行為有異。Strategy 提供了一種用多個行為中的一個行為來配置一個類的方法。
- 需要使用一個算法的不同變體。
- 算法使用客戶不應該知道的數據。
- 一個類定義了多種行為,并且這些行為在這個類的操作中以多個條件語句的形式出現。將相關條件分支移入它們各自的 Strategy 類中以代替。
- 客戶必須了解不同的 Strategy。要選擇合適的 Strategy 就必須知道這些 Strategy 有何不同。
- Strategy 和 Context 之間的通信開銷。Context 可能創建一些 ConcreteStrategy 不使用的參數。
- 增加了對象的數目。
- 相關算法系列。
- 一個替代繼承的方法。
- 消除了一些條件語句。
- 實現的選擇。相同行為的不同實現。
- 使用 Flyweight 模式實現 Strategy。
實現方式(一):使用不同的 Strategy 處理內部狀態。
Strategy 和 Context 接口必須使得 ConcreteStrategy 能夠有效的訪問它所需要的 Context 中的任何數據。
一種辦法是讓 Context 將數據放在參數中傳遞給 Strategy 操作。這使得 Strategy 和 Context 解耦。
但另一方面,Context 可能發送一些 Strategy 不需要的數據。
另一種辦法是讓 Context 將自身作為一個參數傳遞給 Strategy,該 Strategy 再顯式地向該 Context 請求數據。
或者 Strategy 可以直接保存對 Context 的引用。
這種情況下,Strategy 可以請求到它需要的數據。但這使得 Strategy 和 Context 更緊密的耦合在一起。
1 namespace StrategyPattern.Implementation1 2 { 3 public abstract class Strategy 4 { 5 public abstract void AlgorithmInterface(string state); 6 } 7 8 public class ConcreteStrategyA : Strategy 9 { 10 public override void AlgorithmInterface(string state) 11 { 12 Console.WriteLine("Use Concrete Strategy A to handle " + state); 13 } 14 } 15 16 public class ConcreteStrategyB : Strategy 17 { 18 public override void AlgorithmInterface(string state) 19 { 20 Console.WriteLine("Use Concrete Strategy B to handle " + state); 21 } 22 } 23 24 public class Context 25 { 26 private Strategy _strategy; 27 28 public void SetStrategy(Strategy strategy) 29 { 30 _strategy = strategy; 31 } 32 33 public string State { get; set; } 34 35 public void ContextInterface() 36 { 37 _strategy.AlgorithmInterface(State); 38 } 39 } 40 41 public class Client 42 { 43 public void TestCase1() 44 { 45 var context = new Context(); 46 context.State = "Hello World"; 47 48 context.SetStrategy(new ConcreteStrategyA()); 49 context.ContextInterface(); 50 51 context.SetStrategy(new ConcreteStrategyB()); 52 context.ContextInterface(); 53 } 54 } 55 }
《設計模式之美》為 Dennis Gao 發布于博客園的系列文章,任何未經作者本人同意的人為或爬蟲轉載均為耍流氓。
文章列表
留言列表