最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C# 設(shè)計(jì)模式系列教程-模板方法模式

 更新時(shí)間:2016年06月01日 10:37:04   作者:Wang Juqiang  
模板方法模式通過把不變的行為搬移到超類,去除了子類中的重復(fù)代碼,子類實(shí)現(xiàn)算法的某些細(xì)節(jié),有助于算法的擴(kuò)展。

1. 概述

  定義一個(gè)操作中的算法的骨架,而將步驟延遲到子類中。模板方法使得子類可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義算法的某些特定步驟。

2. 模式中的角色

  2.1 抽象類(AbstractClass):實(shí)現(xiàn)了模板方法,定義了算法的骨架。

  2.2 具體類(ConcreteClass):實(shí)現(xiàn)抽象類中的抽象方法,已完成完整的算法。

3. 模式解讀

  3.1 模板方法類圖

http://img.jbzj.com/file_images/article/201606/2016060110441417.png

  3.2 模板方法模式代碼實(shí)現(xiàn)

 /// <summary>
 /// 抽象類
 /// </summary>
 public abstract class AbstractClass
 {
  // 一些抽象行為,放到子類去實(shí)現(xiàn)
  public abstract void PrimitiveOperation1();
  public abstract void PrimitiveOperation2();

  /// <summary>
  /// 模板方法,給出了邏輯的骨架,而邏輯的組成是一些相應(yīng)的抽象操作,它們推遲到子類去實(shí)現(xiàn)。
  /// </summary>
  public void TemplateMethod()
  {
   PrimitiveOperation1();
   PrimitiveOperation2();
   Console.WriteLine("Done the method.");
  }
 }

 /// <summary>
 /// 具體類,實(shí)現(xiàn)了抽象類中的特定步驟
 /// </summary>
 public class ConcreteClassA : AbstractClass
 {
  /// <summary>
  /// 與ConcreteClassB中的實(shí)現(xiàn)邏輯不同
  /// </summary>
  public override void PrimitiveOperation1()
  {
   Console.WriteLine("Implement operation 1 in Concreate class A.");
  }

  /// <summary>
  /// 與ConcreteClassB中的實(shí)現(xiàn)邏輯不同
  /// </summary>
  public override void PrimitiveOperation2()
  {
   Console.WriteLine("Implement operation 2 in Concreate class A.");
  }
 }

 /// <summary>
 /// 具體類,實(shí)現(xiàn)了抽象類中的特定步驟
 /// </summary>
 public class ConcreteClassB : AbstractClass
 {
  /// <summary>
  /// 與ConcreteClassA中的實(shí)現(xiàn)邏輯不同
  /// </summary>
  public override void PrimitiveOperation1()
  {
   Console.WriteLine("Implement operation 1 in Concreate class B.");
  }

  /// <summary>
  /// 與ConcreteClassA中的實(shí)現(xiàn)邏輯不同
  /// </summary>
  public override void PrimitiveOperation2()
  {
   Console.WriteLine("Implement operation 2 in Concreate class B.");
  }
 }

  3.3 客戶端代碼

 class Program
 {
  static void Main(string[] args)
  {
   // 聲明抽象類
   AbstractClass c;

   // 用ConcreteClassA實(shí)例化c
   c = new ConcreteClassA();
   c.TemplateMethod();

   // 用ConcreteClassB實(shí)例化c
   c = new ConcreteClassB();
   c.TemplateMethod();

   Console.Read();
  }
 }

  運(yùn)行結(jié)果

http://img.jbzj.com/file_images/article/201606/2016060110441418.png

5. 模式總結(jié)

  5.1 優(yōu)點(diǎn)

    5.1.1 模板方法模式通過把不變的行為搬移到超類,去除了子類中的重復(fù)代碼。

    5.1.2 子類實(shí)現(xiàn)算法的某些細(xì)節(jié),有助于算法的擴(kuò)展。

    5.1.3 通過一個(gè)父類調(diào)用子類實(shí)現(xiàn)的操作,通過子類擴(kuò)展增加新的行為,符合“開放-封閉原則”。

  5.2 缺點(diǎn)

    5.2.1 每個(gè)不同的實(shí)現(xiàn)都需要定義一個(gè)子類,這會(huì)導(dǎo)致類的個(gè)數(shù)的增加,設(shè)計(jì)更加抽象。

  5.3 適用場景

    5.1 在某些類的算法中,用了相同的方法,造成代碼的重復(fù)。

    5.2 控制子類擴(kuò)展,子類必須遵守算法規(guī)則。

6. 模式舉例: 用冒泡算法非別對(duì)整型數(shù)組、浮點(diǎn)數(shù)數(shù)組、日期數(shù)組實(shí)現(xiàn)排序。

  6.1 實(shí)現(xiàn)類圖

http://img.jbzj.com/file_images/article/201606/2016060110441419.png

  6.2 實(shí)現(xiàn)代碼

 /// <summary>
 /// 抽象類,定義冒泡排序的骨架
 /// </summary>
 public abstract class BubbleSorter
 {
  private int operations = 0;
  protected int length = 0;

  /// <summary>
  /// 冒泡排序算法
  /// </summary>
  /// <returns></returns>
  protected int DoSort()
  {
   operations = 0;
   if (length <= 1)
   {
    return operations;
   }

   for (int nextToLast = length - 2; nextToLast >= 0; nextToLast--)
   {
    for (int index = 0; index <= nextToLast; index++)
    {
     if (OutOfOrder(index))
     {
      Swap(index);
     }

     operations++;
    }
   }

   return operations;
  }

  /// <summary>
  /// 留給子類實(shí)現(xiàn)的交換位置方法
  /// </summary>
  /// <param name="index"></param>
  protected abstract void Swap(int index);
  /// <summary>
  /// 留給子類實(shí)現(xiàn)的比較方法
  /// </summary>
  /// <param name="index"></param>
  /// <returns></returns>
  protected abstract bool OutOfOrder(int index);
 }

 /// <summary>
 /// 整型類型的冒泡算法實(shí)現(xiàn)
 /// </summary>
 public class IntBubbleSorter:BubbleSorter
 {
  private int[] array = null;

  /// <summary>
  /// 用冒泡算法排序
  /// </summary>
  /// <param name="theArray"></param>
  /// <returns></returns>
  public int Sort(int[] theArray)
  {
   array = theArray;
   length = array.Length;
   // 調(diào)用冒泡算法
   return DoSort();
  }

  /// <summary>
  /// 實(shí)現(xiàn)冒泡算法中的交換操作
  /// </summary>
  /// <param name="index"></param>
  protected override void Swap(int index)
  {
   int temp = array[index];
   array[index] = array[index + 1];
   array[index + 1] = temp;
  }

  /// <summary>
  /// 實(shí)現(xiàn)冒泡算法中的比較操作
  /// </summary>
  /// <param name="index"></param>
  /// <returns></returns>
  protected override bool OutOfOrder(int index)
  {
   return (array[index] > array[index + 1]);
  }
 }

 /// <summary>
 /// 浮點(diǎn)數(shù)類型的冒泡算法
 /// </summary>
 public class FloatBubbleSorter:BubbleSorter
 {
  private float[] array = null;

  /// <summary>
  /// 用冒泡算法排序
  /// </summary>
  /// <param name="theArray"></param>
  /// <returns></returns>
  public int Sort(float[] theArray)
  {
   array = theArray;
   length = array.Length;
   // 調(diào)用冒泡算法
   return DoSort();
  }

  /// <summary>
  /// 實(shí)現(xiàn)冒泡算法中的交換操作
  /// </summary>
  /// <param name="index"></param>
  protected override void Swap(int index)
  {
   float temp = array[index];
   array[index] = array[index + 1];
   array[index + 1] = temp;
  }

  /// <summary>
  /// 實(shí)現(xiàn)冒泡算法中的比較操作
  /// </summary>
  /// <param name="index"></param>
  /// <returns></returns>
  protected override bool OutOfOrder(int index)
  {
   return (array[index] > array[index + 1]);
  }
 }

  6.3 客戶端調(diào)用

 class Program
 {
  static void Main(string[] args)
  {

   // 對(duì)整型數(shù)組排序
   int[] intArray = new int[]{5, 3, 12, 8, 10};
   BubbleSorter.IntBubbleSorter sorter = new BubbleSorter.IntBubbleSorter();
   sorter.Sort(intArray);
   foreach (int item in intArray)
   {
    Console.Write(item+" ");
   }

   Console.WriteLine("");

   // 對(duì)浮點(diǎn)數(shù)排序
   float[] floatArray = new float[] { 5.0f, 3.0f, 12.0f, 8.0f, 10.0f };
   BubbleSorter.FloatBubbleSorter floatSorter = new BubbleSorter.FloatBubbleSorter();
   floatSorter.Sort(floatArray);
   foreach (float item in floatArray)
   {
    Console.Write(item + " ");
   }

   Console.Read();
  }
 }

  運(yùn)行結(jié)果

http://img.jbzj.com/file_images/article/201606/2016060110441520.png

以上就是本文的全部內(nèi)容,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C#實(shí)現(xiàn)給Word每一頁設(shè)置不同圖片水印

    C#實(shí)現(xiàn)給Word每一頁設(shè)置不同圖片水印

    Word中設(shè)置水印時(shí),可加載圖片設(shè)置為水印效果,但通常添加水印效果時(shí),會(huì)對(duì)所有頁面都設(shè)置成統(tǒng)一效果。本文將利用C#實(shí)現(xiàn)給Word每一頁設(shè)置不同圖片水印的效果,需要的可以參考一下
    2022-02-02
  • C#連接MySQL操作詳細(xì)教程

    C#連接MySQL操作詳細(xì)教程

    這篇文章主要為大家詳細(xì)介紹了C#連接MySQL操作詳細(xì)教程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C#使用WebSocket與網(wǎng)頁實(shí)時(shí)通信的實(shí)現(xiàn)示例

    C#使用WebSocket與網(wǎng)頁實(shí)時(shí)通信的實(shí)現(xiàn)示例

    本文主要介紹了C#使用WebSocket與網(wǎng)頁實(shí)時(shí)通信的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • c#使用win32api實(shí)現(xiàn)獲取光標(biāo)位置

    c#使用win32api實(shí)現(xiàn)獲取光標(biāo)位置

    本文給大家匯總了2個(gè)使用C#實(shí)現(xiàn)獲取光標(biāo)位置的代碼,非常的簡單實(shí)用,第二種方法更為全面,推薦給大家。
    2016-02-02
  • C# CAD SelectionFilter下TypedValue數(shù)組使用方式

    C# CAD SelectionFilter下TypedValue數(shù)組使用方式

    這篇文章主要介紹了C# CAD SelectionFilter下TypedValue數(shù)組使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • C#復(fù)制數(shù)組的兩種方式及效率比較

    C#復(fù)制數(shù)組的兩種方式及效率比較

    這篇文章介紹了C#復(fù)制數(shù)組的兩種方式及效率比較,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-10-10
  • 關(guān)于C#中的Invoke示例詳解

    關(guān)于C#中的Invoke示例詳解

    一直對(duì)invoke和begininvoke的使用和概念比較混亂,這兩天看了些資料,對(duì)這兩個(gè)的用法和原理有了些新的認(rèn)識(shí)和理解,下面這篇文章主要給大家介紹了關(guān)于C#中Invoke的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • .NET C#利用ZXing生成、識(shí)別二維碼/條形碼

    .NET C#利用ZXing生成、識(shí)別二維碼/條形碼

    ZXing是一個(gè)開放源碼的,用Java實(shí)現(xiàn)的多種格式的1D/2D條碼圖像處理庫,它包含了聯(lián)系到其他語言的端口。這篇文章主要給大家介紹了.NET C#利用ZXing生成、識(shí)別二維碼/條形碼的方法,文中給出了詳細(xì)的示例代碼,有需要的朋友們可以參考借鑒。
    2016-12-12
  • C#實(shí)現(xiàn)TIF圖像轉(zhuǎn)PDF文件的方法

    C#實(shí)現(xiàn)TIF圖像轉(zhuǎn)PDF文件的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)TIF圖像轉(zhuǎn)PDF文件的方法,涉及C#使用TIFtoPDF工具實(shí)現(xiàn)pdf文件轉(zhuǎn)換的技巧,需要的朋友可以參考下
    2015-07-07
  • C#實(shí)現(xiàn)文件分割和合并的示例詳解

    C#實(shí)現(xiàn)文件分割和合并的示例詳解

    這篇文章主要為大家詳細(xì)介紹了如何利用C#實(shí)現(xiàn)文件分割和合并的功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-12-12

最新評(píng)論

广元市| 江门市| 宜黄县| 顺昌县| 铁力市| 平舆县| 锡林郭勒盟| 通城县| 偏关县| 哈尔滨市| 廉江市| 日土县| 诸暨市| 武陟县| 张掖市| 卢氏县| 祁东县| 义马市| 上杭县| 平原县| 青神县| 新兴县| 马尔康县| 平安县| 买车| 西安市| 霍林郭勒市| 远安县| 翁源县| 富阳市| 喀什市| 博兴县| 宜兰市| 宁陵县| 土默特右旗| 固阳县| 万宁市| 凉城县| 英德市| 诸城市| 丹寨县|