策略模式有點類似我剛剛寫的提供者模式。但是在配置上是不同的。下面是一些基本的示範:
模式定義
定義:"準備一組演算法,並將每一個演算法封裝起來,使得它們可以互換。"
模式意圖
策略模式的用意是針對一組演算法,將每一個演算法封裝到具有共同介面的獨立的類中,從而使得它們可以相互替換。使這些演算法可以相互替換,並提供一種方法來選擇最合適的演算法
根據上面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如下: