Strategy Pattern (策略模式)
所謂 Strategy Pattern 的精神,就是將策略 (算法) 封裝為一個對象,易于相互替換,如同 USB 設備一樣可即插即用;而不是將策略、具體的算法和行為,硬編碼在某個類或客戶程序中,導至事后的修改和擴展不易。
若有多種「策略」,就將這些個策略,和這些策略的算法、行為,封裝在各個類中,并讓這些類,去繼承某個公用的抽象類或接口。接著在客戶程序中,就可動態引用,且易于更換這些不同的「策略」,不會因為日后添加、修改了某一個「策略」,就得重新修改、編譯多處的源代碼。此即為一種「封裝變化點」的做法,將常會變化的部分進行抽象、定義為接口,亦即實現「面向接口編程」的概念。且客戶程序 (調用者) 只須知道接口的外部定義即可,具體的實現則無須理會。
The Strategy Pattern defines a family of algorithms, encapsulates each one, and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it.
- Design Patterns: Elements of Reusable Object-Oriented Software
Strategy Pattern 適用的情景:
- 應用中的許多類,在解決某些問題時很相似,但實現的行為有所差異。比如:不同功能的程序,都可能要用到「排序」算法。
- 根據運行環境的不同,需要采用不同的算法。比如:在手機、PC 計算機上,因硬件等級不同,必須采用不同的排序算法。
- 針對給定的目的,存在多種不同的算法,且我們可用代碼實現算法選擇的標準。
- 需要封裝復雜的數據結構。比如:特殊的加密算法,客戶程序僅需要知道調用的方式即可。
- 同上,算法中的羅輯和使用的數據,應該與客戶程序隔離時。

圖 1 這張為很多書籍和文檔都曾出現過的 Strategy 經典 Class Diagram

01_Shell.ASPx.cs
using System;
using com.cnblogs.WizardWu.sample01;
//客戶程序
public partial class _01_Shell : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//執行對象
Context context;
context = new Context(new ConcreteStrategyA());
Response.Write(context.ContextInterface() + "
");
context = new Context(new ConcreteStrategyB());
Response.Write(context.ContextInterface() + "
");
context = new Context(new ConcreteStrategyC());
Response.Write(context.ContextInterface() + "
");
}
}
namespace com.cnblogs.WizardWu.sample01
{
//抽象算法類 (亦可用接口)。定義了所有策略的公共接口
abstract class Strategy
{
//算法需要完成的功能
public abstract string AlgorithmInterface();
}
//具體算法類A
class ConcreteStrategyA : Strategy
{
//算法A實現方法
public override string AlgorithmInterface()
{
return "算法A實現";
}
}
//具體算法類B
class ConcreteStrategyB : Strategy
{
//算法B實現方法
public override string AlgorithmInterface()
{
return "算法B實現";
}
}
//具體算法類C
class ConcreteStrategyC : Strategy
{
//算法C實現方法
public override string AlgorithmInterface()
{
return "算法C實現";
}
}
//執行對象。需要采用可替換策略執行的對象
class Context
{
Strategy strategy;
public Context(Strategy strategy) //構造函數
{
this.strategy = strategy;
}
//執行對象依賴于策略對象的操作方法
public string ContextInterface()
{
return strategy.AlgorithmInterface();
}
}
} // end of namespace
/*
結行結果:
算法A實現
算法B實現
算法C實現
*/
NET技術:C# Design Patterns (2) - Strategy,轉載需保留來源!
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。