2016.12.13學習日記-策略模式

今天學習的爲策略模式,反覆看了幾遍書中關於策略模式的概念後,始終覺得其與簡單工廠模式有很多相似的地方,還不能很清楚的分辨他們的區別。

先用一個實例來了解策略模式。

實例一:旅遊出行的方式可以有多種,如乘坐飛機旅遊,也 可以乘火車旅遊,如果有興趣自行車遊也是一種極具 樂趣的出行方式。不同的旅遊出行方式有不同的實現 過程,客戶根據自己的需要選擇一種合適的旅遊方式。 在本實例中我們用策略模式來模擬這一過程。

策略模式中公有如下角色:

Contex:環境類

Strategy:抽象策略類

CcreteStrategy:具體策略類

在本例中環境類爲Person類;

抽象策略類爲TravelStrategy類;

具體策略類分別有:AirplaneStrategy、TrainStrategy、BiycleStrategy

類圖


代碼如下

Person.cs

namespace Strategy
{
    class Person
    {
        private TravelStrategy ts;
        public void setStrategy(TravelStrategy strategy)
        {
            this.ts = strategy;
        }

        public void toTravel()
        {
            ts.travel();
        }
    }
}
Person類是環境類,它定義並維持了對抽象策略類TravelStrategy]的一個飲用,通過其方法setStrategy在運行時設置一種具體策略。
TravelStrategy.cs

namespace Strategy
{
    abstract class TravelStrategy
    {
        public abstract void travel();
    }
}

AirplaenStrategy,cs

namespace Strategy
{
    class AirplaneStrategy : TravelStrategy
    {
        public override void travel()
        {
            Console.WriteLine("Travel By Plane!");
        }
    }
}
TrainStrategy.cs

namespace Strategy
{
    class TrainStrategy : TravelStrategy
    {
        public override void travel()
        {
            Console.WriteLine("Travel By Train!");
        }
    }
}

BiycleStrategy.cs

namespace Strategy
{
    class BicycleStrategy :TravelStrategy
    {
        public override void travel()
        {
            Console.WriteLine("Travel By Bicycle");
        }
    }
}

客戶端

namespace Strategy
{
    class Program
    {
        static void Main(string[] args)
        {
            Person p1;
            p1 = new Person();
            TravelStrategy ts1;
            ts1 = new AirplaneStrategy();
            p1.setStrategy(ts1);
            p1.toTravel();

            Console.ReadKey();

        }
    }
}



 策略模式定義了一系列的算法,並將每一個算法封裝起來,而且使它們還可以相互替換。策略模式讓算法獨立於使用它的客戶而獨立變化。

應用場景:
1、 多個類只區別在表現行爲不同,可以使用Strategy模式,在運行時動態選擇具體要執行的行爲。
2、 需要在不同情況下使用不同的策略(算法),或者策略還可能在未來用其它方式來實現。
3、 對客戶隱藏具體策略(算法)的實現細節,彼此完全獨立。


學習了策略模式之後,還是不太清楚其與簡單工廠模式的的區別,他們都是通過多態來實現不同子類的選取,實例化不同的類。

從使用這兩種模式的角度來看的話,簡單工廠模式中只需要傳遞相應的條件就能得到想要的一個對象,然後通過這個對象實現算法的操作。而策略模式,使用時必須首先創建一個想使用的類對象,然後將該對象作爲參數傳遞進去,通過該對象調用不同的算法。在簡單工廠模式中實現了通過條件選取一個類去實例化對象,策略模式則將選取相應對象的工作交給模式的使用者,它本身不去做選取工作。


發佈了36 篇原創文章 · 獲贊 2 · 訪問量 9985
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章