今天學習的爲策略模式,反覆看了幾遍書中關於策略模式的概念後,始終覺得其與簡單工廠模式有很多相似的地方,還不能很清楚的分辨他們的區別。
先用一個實例來了解策略模式。
實例一:旅遊出行的方式可以有多種,如乘坐飛機旅遊,也 可以乘火車旅遊,如果有興趣自行車遊也是一種極具 樂趣的出行方式。不同的旅遊出行方式有不同的實現 過程,客戶根據自己的需要選擇一種合適的旅遊方式。 在本實例中我們用策略模式來模擬這一過程。
策略模式中公有如下角色:
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();
}
}
}
學習了策略模式之後,還是不太清楚其與簡單工廠模式的的區別,他們都是通過多態來實現不同子類的選取,實例化不同的類。
從使用這兩種模式的角度來看的話,簡單工廠模式中只需要傳遞相應的條件就能得到想要的一個對象,然後通過這個對象實現算法的操作。而策略模式,使用時必須首先創建一個想使用的類對象,然後將該對象作爲參數傳遞進去,通過該對象調用不同的算法。在簡單工廠模式中實現了通過條件選取一個類去實例化對象,策略模式則將選取相應對象的工作交給模式的使用者,它本身不去做選取工作。