C# 設計形式系列教程-戰略形式。本站提示廣大學習愛好者:(C# 設計形式系列教程-戰略形式)文章只能為提供參考,不一定能成為您想要的結果。以下是C# 設計形式系列教程-戰略形式正文
在講戰略形式之前,我先給年夜家舉個平常生涯中的例子,從首都國際機場到XXX酒店,怎樣曩昔?1)酒店接機辦事,直接開車來接。2)打車曩昔。3)機場快軌+地鐵 4)機場巴士 5)公交車 6)走途經去(不跑累逝世的話) 等等。應用辦法,我們都可以到達從機場到XXX酒店的目標,對吧。那末我所列出的從機場到XXX酒店的的辦法,就是我們可以選擇的戰略。
再舉個例子,就是我們應用WCF時,常常防止不了對它停止擴大,例如受權,我們可以經由過程自界說受權來擴大WCF。這裡我們可以經由過程自界說AuthorizationPolicy和ServiceAuthorizationManager來完成對它的擴大,這是戰略形式的一個真實運用。
1. 概述
它界說了算法家族,分離封裝起來,讓它們之間可以相互調換,此形式讓算法的變更不會影響到應用算法的客戶端。
2. 形式中的腳色
2.1 戰略類(Stratege):界說一切支撐的算法的公共接口。
2.2 詳細戰略類(Concrete Stratege):封裝了詳細的算法或行動,繼續於Stratege類。
2.3 高低文類(Context):用一個ConcreteStratege來設置裝備擺設,保護一個對Stratege對象的援用。
比較開篇例子剖析一下這個形式中的腳色:
在從機場到XXX酒店的這個例子中,戰略類中必定要包含GoToHotel這個辦法。而詳細戰略類應當完成或繼續戰略類,它的完成就不消說了。高低文類,這個類很主要,也很成心思,由於它須要去選擇應用哪一個戰略,例如這個高低我是我,我要從機場到XXX酒店,1)我基本不差錢,酒店也供給接機辦事,那我必定選擇酒店接機呀;2)假如酒店不供給接機我就選擇打的。3)假如我囊中羞怯,便可以選擇公共交通。4)假如我如今錢都花完了,連吃飯的錢都沒有了,那末我只能選擇走途經去了,沒准半道上還得乞食呢!
3. 形式解讀
3.1 戰略形式的普通化類圖

3.2 戰略形式的代碼完成
/// <summary>
/// 戰略類,界說了一切支撐的算法的公共接口
/// </summary>
public abstract class Stratege
{
/// <summary>
/// 戰略類中支撐的算法,固然還可以有更多,這裡只界說了一個。
/// </summary>
public abstract void Algorithm();
}
/// <summary>
/// 詳細戰略 A,完成了一種詳細算法
/// </summary>
public class ConcreteStrategeA : Stratege
{
/// <summary>
/// 詳細算法
/// </summary>
public override void Algorithm()
{
// 戰略A中完成的算法
}
}
/// <summary>
/// 詳細戰略 B,完成了一種詳細算法
/// </summary>
public class ConcreteStrategeB : Stratege
{
/// <summary>
/// 詳細算法
/// </summary>
public override void Algorithm()
{
// 戰略B中完成的算法
}
}
/// <summary>
/// Context 高低文,保護一個對Stratege對象的援用
/// </summary>
public class Context
{
private Stratege m_Stratege;
/// <summary>
/// 初始化高低文時,將詳細戰略傳入
/// </summary>
/// <param name="stratege"></param>
public Context(Stratege stratege)
{
m_Stratege = stratege;
}
/// <summary>
/// 依據詳細戰略對象,挪用其算法
/// </summary>
public void ExecuteAlgorithm()
{
m_Stratege.Algorithm();
}
}
4. 形式總結
4.1 長處
4.1.1 戰略形式是一種界說一系列算法的辦法,從概念下去看,一切算法完成的都是雷同的任務,只是完成分歧,它可以以雷同的方法挪用一切的算法,削減了各類算法類與應用算法類之間的耦合。
4.1.2 戰略形式的Stratege類為Context界說了一系列的可供重用的算法或行動。繼續有助於析掏出這些算法的公共功效。
4.1.3 戰略形式每一個算法都有本身的類,可以經由過程本身的接口零丁測試。因此簡化了單位測試。
4.1.4 戰略形式將詳細算法或行動封裝到Stratege類中,可以在應用這些類中清除前提分支(防止了分歧行動堆砌到一個類中)。
4.2 缺陷
將選擇詳細戰略的職責交給了客戶端,並轉給Context對象
4.3 實用場景
4.3.1 當完成某個功效須要有分歧算法請求時
4.3.2 分歧時光運用分歧的營業規矩時
5. 實例:排序是我們常常接觸到的算法,完成對一個數組的排序有許多辦法,便可以采取分歧的戰略。上面給出了排序功效的戰略形式的處理計劃。
5.1 完成類圖

5.2 代碼完成
/// <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)
{
// 完成冒泡排序算法
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)
{
// 完成拔出排序算法
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>
/// 初始化時將要排序的數組和排序戰略傳入給Context
/// </summary>
/// <param name="array"></param>
/// <param name="stratege"></param>
public SortContext(int[] array, SortStratege stratege)
{
m_Array = array;
m_Stratege = stratege;
}
/// <summary>
/// 挪用排序算法
/// </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 };
//應用冒泡排序算法停止排序
SortStratege sortStratege = new BubbleSort();
SortContext sorter = new SortContext(array, sortStratege);
int[] result = sorter.Sort();
//應用拔出排序算法停止排序
SortStratege sortStratege2 = new InsertSort();
SortContext sorter2 = new SortContext(array, sortStratege2);
int[] result2 = sorter.Sort();
}
}
以上就是本文的全體內容,願望能給年夜家一個參考,也願望年夜家多多支撐。