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(); } }
以上就是本文的全體內容,願望能給年夜家一個參考,也願望年夜家多多支撐。