文章出處

索引

別名

  • 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 發布于博客園的系列文章,任何未經作者本人同意的人為或爬蟲轉載均為耍流氓。


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()