程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C# 設計形式系列教程-戰略形式

C# 設計形式系列教程-戰略形式

編輯:C#入門知識

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 戰略形式的普通化類圖

https://www.aspphp.online/bianchen/UploadFiles_4619/201707/2017072810422437.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 完成類圖

https://www.aspphp.online/bianchen/UploadFiles_4619/201707/2017072810422544.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();
  }
 }

以上就是本文的全體內容,願望能給年夜家一個參考,也願望年夜家多多支撐。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved