淺談策略模式(Strategy Pattern)

來源:互聯網
上載者:User

      策略模式有點類似我剛剛寫的提供者模式。但是在配置上是不同的。下面是一些基本的示範:

模式定義
    定義:"準備一組演算法,並將每一個演算法封裝起來,使得它們可以互換。"
模式意圖
    策略模式的用意是針對一組演算法,將每一個演算法封裝到具有共同介面的獨立的類中,從而使得它們可以相互替換。使這些演算法可以相互替換,並提供一種方法來選擇最合適的演算法

 

根據上面UML,不難看出,在策略模式裡主要有三
種角色:環境角色、抽象策略角色和具體策略角色
1、環境(Context)角色:持有一個抽象策略(Strategy)角色的引用。也叫上下文。
2、抽象策略(Strategy)角色:這是一個抽象角色,通常由一個介面或一個抽象類別來實現。
3、具體策略(ConcreteStrategy)角色:封裝了相應的演算法和行為。

 

Strategy
using System;
using System.Collections.Generic;
using System.Text;

namespace StrategyDemo
{
    /// </summary> 
    /// 抽象策略角色:這是一個抽象角色,通常由一個介面或抽象類別實現。 
    /// 此角色給出所有的具體策略類所需的介面。 
    /// </summary> 
   public abstract class Strategy
   {
       public abstract void WriteLog();
   }

   ////////////////////////////////////////////////////////////////////////////////////////////
   /// </summary>
   /// 具體策略角色:封裝了相關的演算法或行為。 
   /// 記錄檔儲存到資料庫中
   /// </summary> 
    
    public class DBStrategy:Strategy
    {
        public override void WriteLog()
        {
            Console.WriteLine("日誌被記錄到資料庫!");
        }
    }
    /// </summary>
    /// 具體策略角色:封裝了相關的演算法或行為。 
    /// 記錄檔儲存到記事本中
    /// </summary> 
    
    public class TXTStrategy:Strategy
    {
        public override void WriteLog()
        {
            Console.WriteLine("日誌被記錄到TXT記事本!");
        }
    }
    /// </summary>
    /// 具體策略角色:封裝了相關的演算法或行為。 
    /// 記錄檔儲存到xml中
    /// </summary> 
    public class XMLStrategy:Strategy
    {
        public override void WriteLog()
        {
            Console.WriteLine("日誌被記錄到XML檔案中!");
        }
    }
    ///////////////////////////////////////////////////////////////////////////////////////////////////

}

 

 

Context
using System;
using System.Collections.Generic;
using System.Text;

namespace StrategyDemo
{
    /**//// </summary> 
    /// 環境角色:持有一個Strategy類的引用 
    /// </summary> 
    class Context
    {
        Strategy strategy;
        /**//// <summary>
        /// 初始化時傳入具體的策略對象
        /// </summary>
        /// <param name="strategy"></param>
        public Context(Strategy strategy)
        {
            this.strategy = strategy;
        }

        public void ContextStrategy() 
        { 
            strategy.WriteLog(); 
        } 

        /**//// <summary>
        /// 動態設定策略 
        /// </summary>
        /// <param name="strategy"></param>
        public void SetStrategy(Strategy strategy)
        {
            this.strategy=strategy;
        }

    }
}

 

主函數 

Main
using System;
using System.Collections.Generic;
using System.Text;

namespace StrategyDemo
{
    class Program
    {
        //用戶端使用這個策略: 
        static void Main(string[] args)
        {
            //初始化時傳入具體的策略對象 
            Context context = new Context(new XMLStrategy());
            context.ContextStrategy();

            //動態設定策略對象--改變策略 
            context.SetStrategy(new DBStrategy());
            context.ContextStrategy();

            context.SetStrategy(new TXTStrategy());
            context.ContextStrategy();
        }
    }
}

定義了一個抽象策略角色(Strategy),三種不同的日誌記錄策略(TXTStrategy、XMLStrategy和DBStrategy),也就是模式參與者中的具體策略角色,在環境角色裡持有一抽象策略角色的引用,並通過構造器傳入具體的策略對象初始化策略角色的引用,我們還定義了一動態設定策略的方法(SetStrategy),UML如下:

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.