設(shè)計模式之策略模式學(xué)習(xí)
摘 要
策略模式(Strategy):它定義了算法家族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化,不會影響到使用算法的客戶。
--《HeadFirst設(shè)計模式》
一般來說這些算法完成的工作都是一樣的,只是它們的實現(xiàn)不一樣而已,通過策略模式可以定義一個公共的接口去調(diào)用不同的算法類,從而降低了算法類和調(diào)用算法類的耦合度。
關(guān)鍵字:策略模式,接口,抽象類,繼承
1 策略模式分析
策略模式是一種定義一系列算法的方法,定義一個公共的接口,然后使用不同的算法類實現(xiàn)不同的算法。 應(yīng)用場合:只要在分析過程中聽到需要在不同時間應(yīng)用不同的業(yè)務(wù)規(guī)則,就可以考慮使用策略模式處理這種變化的可能性。
優(yōu)點:通過抽象出公共的接口,從而降低算法類和調(diào)用算法類的耦合度(降低耦合度),每個算法都有自己的類,從而方便了每個算法類的單元測試。
不足:我們在策略類里面都直接實例化了各種算法的類,這大大提高了策略類和算法類的耦合度,而且每當(dāng)我們修改策略類的時候我們都要重新編譯程序(修改方法:反射)。

圖1使用策略模式UML
2 代碼
class StrategyA : Strategy
{
public override void AlgorithmInterface()
{
Console.WriteLine("算法A實現(xiàn)");
}
}
class StrategyB : Strategy
{
public override void AlgorithmInterface()
{
Console.WriteLine("算法B實現(xiàn)");
}
}
class StrategyC : Strategy
{
public override void AlgorithmInterface()
{
Console.WriteLine("算法C實現(xiàn)");
}
}
class Context
{
private Strategy strategy = null;
public Context(string type)
{
switch(type)
{
case "A":
this.strategy = new StrategyA(); //instance the object
break;
case "B":
this.strategy = new StrategyB();
break;
case "C":
this.strategy = new StrategyC();
break;
}
}
public void ContextInterface()
{
strategy.AlgorithmInterface();
}
}
3 優(yōu)化
大家可能已經(jīng)發(fā)現(xiàn)我是通過在策略類(Context)中實例化算法類的,這樣加大了策略類和算法類之間的耦合度,好現(xiàn)在我就使用反射來解決這個問題。
首先我們要在項目中心機一個App.config文件然后我們只需在里面設(shè)置好要實例化的類的命名空間就好了。
接下來就像修改策略類(Context)的代碼,這里我們是使用反射實例化算法類,使用泛型的優(yōu)點就是每當(dāng)我們調(diào)用不到的算法只需修改配置文件就OK了,不用重新編譯程序(前提是算法類已經(jīng)存在只是以前沒有調(diào)用它)。
修改Context類之后的代碼:
class Context
{
private Strategy strategy = null;
private static readonly string path = ConfigurationManager.AppSettings["Strategy"];
string className = string.Empty;
public Context(string type)
{
switch(type)
{
case "A":
//this.strategy = new StrategyA(); //instance the object
className = path + ".StrategyA";
this.strategy = (StrategyModel.StrategyA)Assembly.Load(path).CreateInstance(className);
break;
case "B":
//this.strategy = new StrategyB();
className = path + ".StrategyB";
this.strategy = (StrategyModel.StrategyB)Assembly.Load(path).CreateInstance(className);
break;
case "C":
//this.strategy = new StrategyC();
className = path + ".StrategyC";
this.strategy = (StrategyModel.StrategyC)Assembly.Load(path).CreateInstance(className);
break;
}
}
public void ContextInterface()
{
strategy.AlgorithmInterface();
}
}
|
|
關(guān)于作者:[作者]:
JK_Rush從事.NET開發(fā)和熱衷于開源高性能系統(tǒng)設(shè)計,通過博文交流和分享經(jīng)驗,歡迎轉(zhuǎn)載,請保留原文地址,謝謝。 |

策略模式(Strategy):它定義了算法家族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化,不會影響到使用算法的客戶。
--《HeadFirst設(shè)計模式》
一般來說這些算法完成的工作都是一樣的,只是它們的實現(xiàn)不一樣而已,通過策略模式可以定義一個公共的接口去調(diào)用不同的算法類,從而降低了算法類和調(diào)用算法類的耦合度。
浙公網(wǎng)安備 33010602011771號