C# 設(shè)計(jì)模式系列教程-策略模式
在講策略模式之前,我先給大家舉個(gè)日常生活中的例子,從首都國際機(jī)場到XXX酒店,怎么過去?1)酒店接機(jī)服務(wù),直接開車來接。2)打車過去。3)機(jī)場快軌+地鐵 4)機(jī)場巴士 5)公交車 6)走路過去(不跑累死的話) 等等。使用方法,我們都可以達(dá)到從機(jī)場到XXX酒店的目的,對(duì)吧。那么我所列出的從機(jī)場到XXX酒店的的方法,就是我們可以選擇的策略。
再舉個(gè)例子,就是我們使用WCF時(shí),往往避免不了對(duì)它進(jìn)行擴(kuò)展,例如授權(quán),我們可以通過自定義授權(quán)來擴(kuò)展WCF。這里我們可以通過自定義AuthorizationPolicy和ServiceAuthorizationManager來實(shí)現(xiàn)對(duì)它的擴(kuò)展,這是策略模式的一個(gè)真實(shí)應(yīng)用。
1. 概述
它定義了算法家族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化不會(huì)影響到使用算法的客戶端。
2. 模式中的角色
2.1 策略類(Stratege):定義所有支持的算法的公共接口。
2.2 具體策略類(Concrete Stratege):封裝了具體的算法或行為,繼承于Stratege類。
2.3 上下文類(Context):用一個(gè)ConcreteStratege來配置,維護(hù)一個(gè)對(duì)Stratege對(duì)象的引用。
對(duì)比開篇例子分析一下這個(gè)模式中的角色:
在從機(jī)場到XXX酒店的這個(gè)例子中,策略類中必然要包括GoToHotel這個(gè)方法。而具體策略類應(yīng)該實(shí)現(xiàn)或繼承策略類,它的實(shí)現(xiàn)就不用說了。上下文類,這個(gè)類很重要,也很有意思,因?yàn)樗枰ミx擇使用哪個(gè)策略,例如這個(gè)上下我是我,我要從機(jī)場到XXX酒店,1)我根本不差錢,酒店也提供接機(jī)服務(wù),那我必然選擇酒店接機(jī)呀;2)如果酒店不提供接機(jī)我就選擇打的。3)如果我囊中羞澀,就可以選擇公共交通。4)如果我現(xiàn)在錢都花完了,連吃飯的錢都沒有了,那么我只能選擇走路過去了,沒準(zhǔn)半道上還得討飯呢!
3. 模式解讀
3.1 策略模式的一般化類圖
3.2 策略模式的代碼實(shí)現(xiàn)
/// <summary>
/// 策略類,定義了所有支持的算法的公共接口
/// </summary>
public abstract class Stratege
{
/// <summary>
/// 策略類中支持的算法,當(dāng)然還可以有更多,這里只定義了一個(gè)。
/// </summary>
public abstract void Algorithm();
}
/// <summary>
/// 具體策略 A,實(shí)現(xiàn)了一種具體算法
/// </summary>
public class ConcreteStrategeA : Stratege
{
/// <summary>
/// 具體算法
/// </summary>
public override void Algorithm()
{
// 策略A中實(shí)現(xiàn)的算法
}
}
/// <summary>
/// 具體策略 B,實(shí)現(xiàn)了一種具體算法
/// </summary>
public class ConcreteStrategeB : Stratege
{
/// <summary>
/// 具體算法
/// </summary>
public override void Algorithm()
{
// 策略B中實(shí)現(xiàn)的算法
}
}
/// <summary>
/// Context 上下文,維護(hù)一個(gè)對(duì)Stratege對(duì)象的引用
/// </summary>
public class Context
{
private Stratege m_Stratege;
/// <summary>
/// 初始化上下文時(shí),將具體策略傳入
/// </summary>
/// <param name="stratege"></param>
public Context(Stratege stratege)
{
m_Stratege = stratege;
}
/// <summary>
/// 根據(jù)具體策略對(duì)象,調(diào)用其算法
/// </summary>
public void ExecuteAlgorithm()
{
m_Stratege.Algorithm();
}
}
4. 模式總結(jié)
4.1 優(yōu)點(diǎn)
4.1.1 策略模式是一種定義一系列算法的方法,從概念上來看,所有算法完成的都是相同的工作,只是實(shí)現(xiàn)不同,它可以以相同的方式調(diào)用所有的算法,減少了各種算法類與使用算法類之間的耦合。
4.1.2 策略模式的Stratege類為Context定義了一系列的可供重用的算法或行為。繼承有助于析取出這些算法的公共功能。
4.1.3 策略模式每個(gè)算法都有自己的類,可以通過自己的接口單獨(dú)測試。因而簡化了單元測試。
4.1.4 策略模式將具體算法或行為封裝到Stratege類中,可以在使用這些類中消除條件分支(避免了不同行為堆砌到一個(gè)類中)。
4.2 缺點(diǎn)
將選擇具體策略的職責(zé)交給了客戶端,并轉(zhuǎn)給Context對(duì)象
4.3 適用場景
4.3.1 當(dāng)實(shí)現(xiàn)某個(gè)功能需要有不同算法要求時(shí)
4.3.2 不同時(shí)間應(yīng)用不同的業(yè)務(wù)規(guī)則時(shí)
5. 實(shí)例:排序是我們經(jīng)常接觸到的算法,實(shí)現(xiàn)對(duì)一個(gè)數(shù)組的排序有很多方法,即可以采用不同的策略。下面給出了排序功能的策略模式的解決方案。
5.1 實(shí)現(xiàn)類圖
5.2 代碼實(shí)現(xiàn)
/// <summary>
/// 排序算法策略
/// </summary>
public abstract class SortStratege
{
/// <summary>
/// 排序
/// </summary>
/// <param name="array"></param>
/// <returns></returns>
public abstract int[] Sort(int[] array);
}
/// <summary>
/// 冒泡排序
/// </summary>
public class BubbleSort : SortStratege
{
/// <summary>
/// 冒泡排序算法(遞增排序)
/// </summary>
/// <param name="array"></param>
/// <returns></returns>
public override int[] Sort(int[] array)
{
// 實(shí)現(xiàn)冒泡排序算法
for (int i = 0; i < array.Length; i++)
{
for (int j = i + 1; j < array.Length; j++)
{
if (array[i] > array[j])
{
int temp = array[j];
array[j] = array[i];
array[i] = temp;
}
}
}
return array;
}
}
/// <summary>
/// 插入排序
/// </summary>
public class InsertSort : SortStratege
{
/// <summary>
/// 插入排序算法(遞增排序)
/// </summary>
/// <param name="array"></param>
/// <returns></returns>
public override int[] Sort(int[] array)
{
// 實(shí)現(xiàn)插入排序算法
int temp;
int i, j, n;
n = array.Length;
for (i = 1; i < n; i++)
{
temp = array[i];
for (j = i; j > 0; j--)
{
if (temp < array[j - 1])
array[j] = array[j - 1];
else
break;
array[j] = temp;
}
}
return null;
}
}
public class SortContext
{
private int[] m_Array;
private SortStratege m_Stratege;
/// <summary>
/// 初始化時(shí)將要排序的數(shù)組和排序策略傳入給Context
/// </summary>
/// <param name="array"></param>
/// <param name="stratege"></param>
public SortContext(int[] array, SortStratege stratege)
{
m_Array = array;
m_Stratege = stratege;
}
/// <summary>
/// 調(diào)用排序算法
/// </summary>
/// <returns></returns>
public int[] Sort()
{
int[] result = m_Stratege.Sort(this.m_Array);
return result;
}
}
5.3 客戶端代碼
public class Program
{
public static void Main(Object[] args)
{
int[] array = new int[] { 12, 8, 9, 18, 22 };
//使用冒泡排序算法進(jìn)行排序
SortStratege sortStratege = new BubbleSort();
SortContext sorter = new SortContext(array, sortStratege);
int[] result = sorter.Sort();
//使用插入排序算法進(jìn)行排序
SortStratege sortStratege2 = new InsertSort();
SortContext sorter2 = new SortContext(array, sortStratege2);
int[] result2 = sorter.Sort();
}
}
以上就是本文的全部內(nèi)容,希望能給大家一個(gè)參考,也希望大家多多支持我們。
上一篇:C# 設(shè)計(jì)模式系列教程-觀察者模式
欄 目:C#教程
本文標(biāo)題:C# 設(shè)計(jì)模式系列教程-策略模式
本文地址:http://www.jygsgssxh.com/a1/C_jiaocheng/6490.html
您可能感興趣的文章
- 01-10深入淺出23種設(shè)計(jì)模式
- 01-10TortoiseSVN使用教程
- 01-10C#編程中枚舉類型的使用教程
- 01-10Python設(shè)計(jì)模式編程中的備忘錄模式與對(duì)象池模式示例
- 01-10C#中的delegate委托類型基本學(xué)習(xí)教程
- 01-10dotNet中的反射用法入門教程
- 01-10詳解C#的設(shè)計(jì)模式編程之抽象工廠模式的應(yīng)用
- 01-10解析C#設(shè)計(jì)模式編程中的裝飾者模式
- 01-10簡單了解C#設(shè)計(jì)模式編程中的橋接模式
- 01-10C#編程中使用設(shè)計(jì)模式中的原型模式的實(shí)例講解


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻播放器左下角滾動(dòng)新
- 01-10C#停止線程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10delphi制作wav文件的方法
- 04-02jquery與jsp,用jquery


