設計模式之禪-18.策略模式(Strategy Pattern)C#範例(筆記)

一、策略模式定義

策略模式(Strategy Pattern)是一種比較簡單的模式,也就是政策模式(Policy Pattern)。

定義:定義一組算法,將每個算法都封裝起來,使他們之間可以互換。

● Context封裝角色

它也叫做上下文角色,起承上啟下封裝作用,屏蔽高層模塊對策略、算法的直接訪問,封裝可能存在的變化。

● Strategy抽象策略角色

策略、算法家族的抽象,通常為接口,定義每個策略或算法必須具有的方法和屬性。

● ConcreteStrategy具體策略角色

實現抽象策略中的操作,該類含有具體的算法。

二、策略模式範例情境

提到三國為範例,每一個方法為一個妙計。

public interface IStrategy
{
    //每個妙計都是一個可執行的算法
    void operate();
}

//第一妙計:找喬國老開後門
public class BackDoor : IStrategy
{
    public void operate()
    {
        Console.WriteLine("找喬國老幫忙,讓吳國太給孫權施加壓力");
    }
}

//第二妙計:吳國太開綠燈
public class GivenGreenLight : IStrategy
{
    public void operate()
    {
        Console.WriteLine("求吳國太開綠燈,放行!");
    }
}

//第三妙計:讓新娘子權夫人斷後
public class BlockEnemy : IStrategy
{
    public void operate()
    {
        Console.WriteLine("孫夫人斷後,擋住追兵");
    }
}

現在,妙計都有了,缺少兩個配角,一個承裝妙計的錦囊(錦囊妙計),一個是執行人趙雲。趙雲取出錦囊中的妙計,接著執行,獲勝,來看看如何實現。

在類別圖中加入一個Context封裝類(也就是錦囊),其承裝三個策略,方便趙雲使用。如圖下

public class Context
{
    //構造函數,你要使用哪個妙計
    private IStrategy strategy;

    public Context(IStrategy strategy)
    {
        this.strategy = strategy;
    }

    //使用計謀
    public void operate()
    {
        this.strategy.operate();
    }
}

三個妙計有了錦囊也有了,接著趙雲取出妙計去執行項目。

public class ZhaoYun
{
    class Program
    {
        static void Main(string[] args)
        {
            Context context;

            //剛到吳國拆第一個
            Console.WriteLine("---剛到吳國時候拆第一個妙計---");
            context = new Context(new BackDoor());
            //執行第一個
            context.operate();

            //劉備拆第二個
            Console.WriteLine("---劉備拆了第二個---");
            context = new Context(new GivenGreenLight());
            //執行第二個
            context.operate();

            //孫權拆第三個
            Console.WriteLine("---孫權拆了第三個---");
            context = new Context(new BlockEnemy());
            //執行第三個
            context.operate();

            Console.ReadKey();
        }
    }
}

執行結果如下:

---剛到吳國時候拆第一個妙計---
找喬國老幫忙,讓吳國太給孫權施加壓力
---劉備拆了第二個---
求吳國太開綠燈,放行!
---孫權拆了第三個---
孫夫人斷後,擋住追兵

整個故事過程為策略模式。