【設計模式之策略模式】

我是太陽啦啦啦發表於2016-02-22

前言:

最近在學習設計模式,簡單工廠是接觸的第一個模式,後來,就遇到了策略模式,策略模式真是有謀略啊!定義了演算法家族,有了演算法家族,再難的計算都不在話下了!!!今天,我們一起來學習策略模式,看看這是一個怎樣的設計模式?

中心:

(一)定義

官方:

它定義了演算法家族,分別封裝起來起來,讓他們之間可以相互替代,此模式讓演算法的變化,不會影響到使用演算法的使用者。

個人理解:

定義了一系列的演算法,將演算法封裝在獨立的策略類中,既然獨立,就可以相互替代,所有的演算法完成的是相同的工作,只是實現不同,它以相同的方式呼叫所有的演算法。

相比繼承的優點:

繼承提供了一種支援多種演算法或行為的方法,而繼承使得演算法父類與子類混合,難以理解、維護、和擴充套件,還不同的動態的改變演算法,這是繼承的缺點,正是策略模式的優點。使用策略模式,使得易於切換理解、和擴充套件

(二)結構圖

UML圖:

例子:

以商場打折為例,可用下圖來理解策略模式。

(三)主要程式碼

Strategy類,定義所有支援的演算法的公共介面
<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;">//抽象演算法類
        abstract class Strategy
        {
            //演算法方法
            public abstract void AlgorithmInterface();
        }</span></span></span>
ConcreteStrategy,封裝了具體的演算法或行為,繼承於Strategy
<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;"> //具體演算法A
        class ConcreteStrategyA:Strategy
        {
            //演算法A實現方法
            public override void AlgorithmInterface()
            {
                Console.WriteLine("演算法A實現");
            }
        }
        //具體演算法B
        class ConcreteStrategyB : Strategy
        {
            //演算法b實現方法
            public override void AlgorithmInterface()
            {
                Console.WriteLine("演算法B實現");
            }
        }
        //具體演算法C
        class ConcreteStrategyC : Strategy
        {
            //演算法A實現方法
            public override void AlgorithmInterface()
            {
                Console.WriteLine("演算法C實現");
            }
        }</span></span></span>
Context,用一個ConcreteStrategy來配置,維護一個對Strategy物件的引用
<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;"> //上下文
        class Context
        {
            Strategy strategy;
            public Context (Strategy strategy)
            {
                this.strategy = strategy;
            }
            //上下文介面
            public void ContextInterface()
            {
                strategy.AlgorithmInterface();
            }
        }</span></span></span>
客戶端程式碼
<span style="font-size:18px;"><span style="font-size:18px;"> <span style="font-size:18px;">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();
        }</span></span></span>

(四)定位

策略模式,從字面可以理解“出謀劃策”,是一種行為,故屬於行為型模式。

(五)優缺點

優點:減少耦合,簡化測試(單元測試)
缺點:客戶端知道所有的類,任務重,造成很多策略類

(六)何時用

1. 如果在一個系統裡面有許多類,它們之間的區別僅在於它們的行為

2. 一個系統的演算法使用的資料不可以讓客戶端知道。

3. 如果一個物件有很多的行為,


在實踐中,只要分析過程中聽到需要在不同時間應用不同的業務規則,就可以考慮使用策略模式。

總結:

策略模式,你懂了嗎?希望這篇部落格,對大家有用!

相關文章