亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C# 設計模式系列教程-策略模式

2020-01-24 01:08:19
字體:
來源:轉載
供稿:網友

  在講策略模式之前,我先給大家舉個日常生活中的例子,從首都國際機場到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 策略模式的一般化類圖

http://files.VeVB.COm/file_images/article/201606/2016060111500833.png

  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 實現類圖

http://files.VeVB.COm/file_images/article/201606/2016060111500834.png

  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();  } }

以上就是本文的全部內容,希望能給大家一個參考,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产美女主播一区| 国产精品露脸自拍| 亚洲免费av电影| 国产欧美在线观看| 欧美亚洲一区在线| www国产亚洲精品久久网站| 国产精品丝袜高跟| 国产日韩欧美中文在线播放| 久久影视电视剧免费网站清宫辞电视| 欧美日韩一区二区三区| 国产精品视频网址| 国产欧美日韩中文字幕在线| 午夜精品美女自拍福到在线| 日韩亚洲综合在线| 久久视频在线观看免费| 美乳少妇欧美精品| 久久精品视频在线播放| 欧美老少做受xxxx高潮| 久久91精品国产| 成人黄色午夜影院| 欧美一级电影免费在线观看| 正在播放欧美一区| 欧美自拍视频在线观看| 亚洲性av网站| 日韩亚洲成人av在线| 欧美日韩不卡合集视频| 中文字幕视频一区二区在线有码| 色狠狠久久aa北条麻妃| 亚州成人av在线| 亚洲人成伊人成综合网久久久| 欧美日韩免费一区| 黄色精品在线看| 清纯唯美亚洲激情| 亚洲天堂免费观看| 成人福利视频在线观看| 国产精品久久久久久久久久小说| 亚洲人成电影网站色…| 国产精品999| 精品国产电影一区| 亚洲人成电影在线观看天堂色| 欧美最猛黑人xxxx黑人猛叫黄| 人体精品一二三区| 亚洲精品在线看| 欧美激情国产高清| 亚洲免费视频在线观看| 国产欧美日韩中文| www国产精品视频| 富二代精品短视频| 亚洲成人av中文字幕| 日韩av在线免费观看| 国产91在线高潮白浆在线观看| 国产精品精品一区二区三区午夜版| 亚洲国产欧美一区二区三区久久| 欧美激情视频在线| 青青草原一区二区| 最新的欧美黄色| 欧洲成人在线视频| 日韩中文字幕不卡视频| 国产精品久久综合av爱欲tv| 午夜精品一区二区三区av| 成人黄色免费片| 亚洲国产97在线精品一区| 国产a∨精品一区二区三区不卡| 91国产视频在线播放| 亚洲网在线观看| 黄色一区二区在线观看| 日韩视频第一页| 热久久视久久精品18亚洲精品| 亚洲二区在线播放视频| 亚洲电影免费观看高清| 国产噜噜噜噜噜久久久久久久久| 国产在线拍揄自揄视频不卡99| 久热精品视频在线观看一区| 亚洲欧美中文日韩在线v日本| 亚洲国产精品va在看黑人| 国内精品模特av私拍在线观看| 亚洲一区中文字幕| 97精品一区二区视频在线观看| 狠狠色噜噜狠狠狠狠97| 91社影院在线观看| 欧美一级电影久久| 26uuu久久噜噜噜噜| 国a精品视频大全| 亚洲第一天堂无码专区| 欧美性猛交xxxxx水多| 欧美大片在线看免费观看| 欧美成人免费小视频| 欧美激情欧美狂野欧美精品| 国产精品色午夜在线观看| 欧美日韩国产限制| 欧日韩在线观看| 欧美激情乱人伦| 欧美激情三级免费| 亚洲精品v天堂中文字幕| 亚洲天堂av女优| 国产精品久久久久久久久久| 精品国产自在精品国产浪潮| 国产精品视频免费在线观看| 亚洲欧美日韩成人| 欧美亚洲另类制服自拍| 91免费版网站入口| 狠狠躁夜夜躁人人躁婷婷91| 91精品久久久久久久久青青| 国产成人精品视频| 久久久久久尹人网香蕉| 精品在线欧美视频| 欧美一级视频一区二区| 91sao在线观看国产| 精品国产乱码久久久久久虫虫漫画| 亚洲另类图片色| 国产成人自拍视频在线观看| 日韩在线免费视频观看| 成人欧美在线观看| 97久久精品人搡人人玩| 精品自拍视频在线观看| 黑人与娇小精品av专区| 尤物九九久久国产精品的特点| 伊人久久免费视频| 成人情趣片在线观看免费| 亚洲色图15p| 欧美韩国理论所午夜片917电影| 91久久精品久久国产性色也91| 成人免费淫片视频软件| 国产亚洲视频中文字幕视频| 国产精品高潮呻吟视频| 欧洲成人午夜免费大片| 精品国产网站地址| 亚洲区一区二区| 2019中文字幕全在线观看| 91成人国产在线观看| 亚洲一区二区三区四区视频| 疯狂做受xxxx高潮欧美日本| 日韩大片免费观看视频播放| 欧美主播福利视频| 欧美丰满老妇厨房牲生活| 久久电影一区二区| 九九热这里只有精品免费看| 中文字幕成人精品久久不卡| 日韩av电影在线网| 日韩一区二区三区xxxx| 成人av色在线观看| 日韩一区二区av| 国产精品国产三级国产aⅴ9色| 亚洲伦理中文字幕| 久久久97精品| 国产精品亚洲精品| 777午夜精品福利在线观看| 一本色道久久88亚洲综合88| www.亚洲男人天堂| 亚洲一区制服诱惑| 久久91超碰青草是什么| 国产视频综合在线| 久久久中文字幕| 青草青草久热精品视频在线观看| 欧美疯狂性受xxxxx另类| 亚洲专区在线视频| 国产精品成人品| 国产一区二区视频在线观看| 亚洲欧美福利视频| 性欧美办公室18xxxxhd| 亚洲另类xxxx| 亚洲的天堂在线中文字幕| 欧美大秀在线观看| 国产这里只有精品|