設計模式學習總結-策略模式(Strategy Pattern)

來源:互聯網
上載者:User

問題:
當我們定義一系列的演算法,怎麼能使得演算法為應對不同的業務需要能自由的動態替換而又不影響到用戶端的使用,並且演算法的增減、修改都不會影響環境和用戶端。

定義:
策略模式定義了一系列演算法,把它們一個個封裝起來,並且使它們可相互替換。該模式可使得演算法能獨立於使用它的客戶而變化。

意圖:
 Strategy模式是行為模式,正因為他是一種行為模式,所以他不是用來解決類的執行個體化的,跟建立什麼樣的產品沒有關係,此模式解決的問題是把一個系列完成相同工作,卻實現不同的演算法(行為)封裝到一系列的策略類裡面,使得它們可以相互替換,提供一個提供者,由用戶端決定在什麼情況下使用什麼具體策略,來完成某一功能。並可以自由的添加修改相應的演算法,輕鬆實現可插入式(Pluggable)的系統的開發。對於用戶端來說,不關心執行個體化了那些對象,生產了那些產品,只需要提供要使用那種策略去完成某一功能。

參與者:
•抽象策略(Strategy)角色:
定義了所支援演算法的公用介面,各種不同的演算法以不同的方式實現這個介面,Context通過這個介面來調用ConcreteStrategy定義的演算法。一般使用介面或抽象類別實現。
•具體策略(ConcreteStrategy)角色:
繼承抽象策略(Strategy)角色,封裝了具體的演算法和行為。
•Context:
策略的外部封裝類,或者說策略的容器類。它維護了一個對Strategy對象的引用。負責根據不同策略動態設定運行時Strategy具體的ConcreteStrategy,並實現互動和資料傳遞。
UML圖:

 
執行個體說明:

諾基亞手機工廠
比如Nokia公司現有中國,芬蘭兩家生產工廠。在中國生產的是亞太地區版,在芬蘭生產的是歐美版,兩個工廠的生產細節可能是不同的,但是都可以生產N8,N9兩款手機,並且可以動態增加手機工廠,如墨西哥工廠生產拉美版的N8,N9.

uml圖如下:

 

代碼:

/// <summary>
/// 手機工廠抽象策略(Strategy)角色
/// </summary>
public abstract class IPhoneFactory
{
    public abstract void CreateN8();
    public abstract void CreateN9();
}
/// <summary>
/// 手機工廠具體策略(ConcreteStrategy)角色
/// </summary>
public class PhoneFactory_China : IPhoneFactory
{

    public override void CreateN8()
    {
        System.Console.WriteLine("我是中國生產的N8");
    }

    public override void CreateN9()
    {
        System.Console.WriteLine("我是中國生產的N9");
    }
}
/// <summary>
/// 手機工廠具體策略(ConcreteStrategy)角色
/// </summary>
public class PhoneFactory_Finland : IPhoneFactory
{
    public override void CreateN8()
    {
        System.Console.WriteLine("我是芬蘭生產的N8");
    }

    public override void CreateN9()
    {
        System.Console.WriteLine("我是芬蘭生產的N9");
    }
}
/// <summary>
/// 手機生產Context
/// </summary>
public class PhoneFactoryContext
{
    IPhoneFactory phoneFactory = null;
    public PhoneFactoryContext(IPhoneFactory _phoneFactory)
    {
        this.phoneFactory = _phoneFactory;
    }

    public void CreateN8()
    {
        phoneFactory.CreateN8();
    }

    public void CreateN9()
    {
        phoneFactory.CreateN9();
    }
}

/// <summary>
/// 用戶端
/// </summary>
void StrategyTest()
{
    PhoneFactoryContext context = new PhoneFactoryContext(new PhoneFactory_China());
    context.CreateN8();
}

 

優點:
•策略模式提供了管理相關的演算法族的辦法。策略類的等級結構定義了一個演算法或行為族,並能起到很好的約束作用。
•避免程式中使用多重條件轉移語句,使系統更靈活,並易於擴充。

缺點:

•每個具體策略類都會產生一個新類,所以會增加系統需要維護的類的數量。
•用戶端必須知道所有的策略類,並自行決定使用哪一個策略類。

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

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.