策略模式(Strategy):定義了算法家族,分別封裝起來曲伊,讓它們之間可以互相替換叽讳,此模式讓算法的變化,不會影響到使用算法的客戶坟募。[DP][大話設(shè)計(jì)模式]
我們先看看策略模式的結(jié)構(gòu)圖與基本代碼:
Strategy類岛蚤,定義所有支持的算法的公共接口
//抽象算法類
abstract class Strategy
{
//算法方法
public abstract void AlgorithmInterface();
}
ConcreteStrategy,封裝了具體的算法或行為,繼承于Strategy
/// 具體算法A
class ConcreteStrategyA : Strategy
{
/// 算法A實(shí)現(xiàn)方法
public override void AlgorithmInterface()
{
//算法實(shí)現(xiàn)
}
}
// 具體算法B
class ConcreteStrategyB : Strategy
{
// 算法B實(shí)現(xiàn)方法
public override void AlgorithmInterface()
{
}
}
// 具體算法C
class ConcreteStrategyC : Strategy
{
// 算法C實(shí)現(xiàn)方法
public override void AlgorithmInterface()
{
}
}
Context,用一個(gè)ConcreteStrategy來配置懈糯,維護(hù)一個(gè)對Strategy對象的引用涤妒。
//上下文
class Context
{
Strategy strategy;
// 初始化時(shí)傳入具體的策略對象
public Context(Strategy strategy) {
this.strategy = strategy;
}
//上下文接口
public void ContextInterface() {// 根據(jù)具體的策略對象,調(diào)用其算法的方法
strategy.AlgorithmInterface();
}
}
客戶端代碼:
static void Main(string[] args) {
Context context;
context = new Context(new ConcreteStrategyA());
context.ContextInterface();
context = new Context(new ConcreteStrategyB());
context.ContextInterface();
context = new Context(new ConcreteStrategyC());
context.ContextInterface();
Console.Read();
}
由于實(shí)例化不同的策略赚哗,所以最終在調(diào)用context.ContextInterface();時(shí)她紫,所獲得結(jié)果不盡相同。
總結(jié):策略模式是一種定義一系列算法的方法蜂奸,從概念上來看犁苏,所以這些算法都完成的相同的工作,只是實(shí)現(xiàn)不同扩所,它可以 以相同的方式調(diào)用所有的算法围详,減少了各種算法類與使用算法類之間的耦合。
優(yōu)點(diǎn):
1.策略模式的Strategy類層次為Context定義了一系列的可供重用的算法或行為祖屏。繼承有助于析取出這些算法中的公共功能助赞。
2.策略模式簡化了單元測試,轉(zhuǎn)為每個(gè)算法都有自己的類袁勺,可以通過自己的接口單獨(dú)測試雹食。
3.簡化了客戶端的代碼,使代碼層次更清晰期丰,消除了類中的條件語句群叶。把一個(gè)個(gè)行為封裝在Strategy類中吃挑。
應(yīng)用:當(dāng)在分析過程中聽到需要在不同時(shí)間應(yīng)用 不同的業(yè)務(wù)規(guī)則,就可以考慮使用策略模式處理這種變化的可能性街立。