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

詳解C#設(shè)計(jì)模式編程中生成器模式的使用

 更新時(shí)間:2016年02月25日 09:23:30   作者:scucj  
這篇文章主要介紹了詳解C#設(shè)計(jì)模式編程中生成器模式的使用,生成器模式主張創(chuàng)建對(duì)象的過(guò)程和對(duì)象的表現(xiàn)應(yīng)該分離開(kāi)來(lái),需要的朋友可以參考下

一、概述
在軟件系統(tǒng)中,有時(shí)候面臨著復(fù)雜的對(duì)象創(chuàng)建,該對(duì)象由一定算法構(gòu)成的子對(duì)象組成,由于需求變化,這些子對(duì)象會(huì)經(jīng)常變換,但組合在一起的算法卻是穩(wěn)定的。生成器模式可以處理這類(lèi)對(duì)象的構(gòu)建,它提供了一種封裝機(jī)制來(lái)隔離各類(lèi)子對(duì)象的變化,從而保證系統(tǒng)的穩(wěn)定。
二、生成器模式
生成器模式將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。其結(jié)構(gòu)圖如下:

201622592147347.gif (424×179)

  • Builder為創(chuàng)建Product對(duì)象的各個(gè)子對(duì)象指定抽象接口。
  • ConcreteBuilder實(shí)現(xiàn)了Builder接口,用于創(chuàng)建Product對(duì)象的各個(gè)子對(duì)象。
  • Director使用Builder來(lái)創(chuàng)建Product對(duì)象。
  • Product表示被構(gòu)造的復(fù)雜對(duì)象。


三、示例

using System;
using System.Collections.Generic;
using System.Text;

namespace BuilderPattern
{
  /// <summary>
  /// 所有課程
  /// </summary>
  public class Coures
  {    
    /// <summary>
    /// 保存課程信息
    /// </summary>
    IDictionary<string, decimal> coures = new Dictionary<string, decimal>();

    /// <summary>
    /// 選課
    /// </summary>
    /// <param name="serialNumber"></param>
    /// <param name="score"></param>
    public void Select(string serialNumber, decimal score)
    {
      coures.Add(serialNumber, score);
    }

    /// <summary>
    /// 計(jì)算總學(xué)分
    /// </summary>
    /// <returns>總學(xué)分</returns>
    public decimal ComputeScores()
    {
      decimal scores = 0;
      foreach (KeyValuePair<string, decimal> kvp in coures) 
      {  
        Console.WriteLine(kvp.Key + ":" + kvp.Value);
        Console.WriteLine(" ");
        scores += kvp.Value;
      }
      return scores;
    }
  }
  
  /// <summary>
  /// 選課建造者抽象類(lèi),表現(xiàn)(下面的抽象函數(shù))是相對(duì)穩(wěn)定的。
  /// </summary>
  public abstract class Builder
  {
    /// <summary>
    /// 必修課程成績(jī)
    /// </summary>
    public abstract void BuildCompulsory();

    /// <summary>
    /// 選修課程成績(jī)
    /// </summary>
    public abstract void BuildElective();

    /// <summary>
    /// 限制課程成績(jī)
    /// </summary>
    public abstract void BuildRestriction();

    /// <summary>
    /// 獲得課程字典對(duì)象
    /// </summary>
    /// <returns></returns>
    public abstract Coures GetCoures();
  }

  /// <summary>
  /// 本科生選課成績(jī)
  /// </summary>
  public class UndergraduateBuilder : Builder
  {
    private Coures coures = new Coures();

    /// <summary>
    /// 本科生選必修課程成績(jī)
    /// </summary>
    public override void BuildCompulsory()
    {
      coures.Select("001", 80M);
    }

    /// <summary>
    /// 本科生選選修課程成績(jī)
    /// </summary>
    public override void BuildElective()
    {
      coures.Select("101", 85M);
    }

    /// <summary>
    /// 本科生選限制課程成績(jī)
    /// </summary>
    public override void BuildRestriction()
    {
      coures.Select("201", 95M);
    }

    /// <summary>
    /// 本科生選獲得課程字典對(duì)象
    /// </summary>
    /// <returns></returns>
    public override Coures GetCoures()
    {
      return coures;
    }
  }

  /// <summary>
  /// 研究生選課成績(jī)
  /// </summary>
  public class GraduateBuilder : Builder
  {
    private Coures coures = new Coures();

    /// <summary>
    /// 研究生選必修課程成績(jī)
    /// </summary>
    public override void BuildCompulsory()
    {
      coures.Select("S001", 70M);
    }

    /// <summary>
    /// 研究生選選修課程成績(jī)
    /// </summary>
    public override void BuildElective()
    {
      coures.Select("S101", 75M);
    }

    /// <summary>
    /// 研究生選限制課程成績(jī)
    /// </summary>
    public override void BuildRestriction()
    {
      coures.Select("S201", 80M);
    }

    /// <summary>
    /// 研究生選獲得課程字典對(duì)象
    /// </summary>
    /// <returns></returns>
    public override Coures GetCoures()
    {
      return coures;
    }
  }

  /// <summary>
  /// 課程成績(jī)管理類(lèi)
  /// </summary>
  public class CourseScoresManager
  {
    /// <summary>
    /// 這里的參數(shù)便是未確定的
    /// </summary>
    /// <param name="builder"></param>
    public void CourseScoresManager(Builder builder)
    {
      builder.BuildCompulsory();
      builder.BuildElective();
      builder.BuildRestriction();
    }
  }

  class Program
  {
    static void Main(string[] args)
    {      
      /* Builder instance = new UndergraduateBuilder(); */
      Builder instance = new GraduateBuilder();
      CourseScoresManager courseScoresManager = new CourseScoresManager(instance);
      Coures coures = instance.GetCoures();
      decimal totalScores = coures.ComputeScores();
      Console.WriteLine(totalScores);
      Console.WriteLine(" ");
      Console.ReadLine();
    }
  }
}

四、使用場(chǎng)景
      應(yīng)用場(chǎng)景是當(dāng)創(chuàng)建一個(gè)復(fù)雜的對(duì)象時(shí),這個(gè)對(duì)象由各個(gè)子對(duì)象構(gòu)成,而由于需求的變化導(dǎo)致子對(duì)象的性質(zhì)也是未確定的。
 我們一般為一個(gè)類(lèi)提供構(gòu)造函數(shù),并利用這個(gè)構(gòu)造函數(shù)完成對(duì)象的創(chuàng)建工作。當(dāng)客戶(hù)知道為哪個(gè)類(lèi)創(chuàng)建實(shí)例,并知道構(gòu)造函數(shù)的參數(shù)時(shí)(假設(shè)是用帶參數(shù)的構(gòu)造函數(shù))。然而由于條件的現(xiàn)限制,是無(wú)法用通常的方式來(lái)構(gòu)造對(duì)象的實(shí)例! 在進(jìn)行對(duì)象構(gòu)造之前,要逐步收集與構(gòu)造相關(guān)的信息.那么創(chuàng)建對(duì)象的過(guò)程和對(duì)象的表現(xiàn)就應(yīng)該分離開(kāi)來(lái)。此時(shí)對(duì)象的表現(xiàn)是相對(duì)穩(wěn)定的。

 

相關(guān)文章

  • 基于C# 生成Zip壓縮包代碼

    基于C# 生成Zip壓縮包代碼

    壓縮包制作也是很多項(xiàng)目中需要用到的功能。接下來(lái)通過(guò)本文給大家介紹基于C# 生成Zip壓縮包代碼,對(duì)c生成zip壓縮包相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧
    2016-04-04
  • c#中XML解析文件出錯(cuò)解決方法

    c#中XML解析文件出錯(cuò)解決方法

    在解析xml時(shí),經(jīng)常因?yàn)槲募泻厥庾址馕鍪?。原因有兩個(gè):一是內(nèi)容中含有XML預(yù)定義好的實(shí)體,二是內(nèi)容中含有低位非打印字符
    2014-08-08
  • C#實(shí)現(xiàn)彈窗提示輸入密碼

    C#實(shí)現(xiàn)彈窗提示輸入密碼

    這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)彈窗提示輸入密碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • DevExpress GridView自動(dòng)滾動(dòng)效果

    DevExpress GridView自動(dòng)滾動(dòng)效果

    這篇文章主要為大家詳細(xì)介紹了DevExpress GridView自動(dòng)滾動(dòng)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • C#和lua相互調(diào)用的方法教程

    C#和lua相互調(diào)用的方法教程

    lua是一種腳本語(yǔ)言,可以方便的移植到各種宿主語(yǔ)言中,并且可以支持熱更新,在游戲開(kāi)發(fā)中也能當(dāng)做主要的語(yǔ)言來(lái)編寫(xiě)游戲的邏輯,所以這篇文章主要給大家介紹了關(guān)于C#和lua相互調(diào)用的方法教程,需要的朋友可以參考下。
    2017-11-11
  • C# 中使用 Exceptionless的方法

    C# 中使用 Exceptionless的方法

    這篇文章主要介紹了C# 中使用 Exceptionless的方法,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2020-12-12
  • C#中使用強(qiáng)制類(lèi)型實(shí)現(xiàn)字符串和ASCII碼之間的轉(zhuǎn)換

    C#中使用強(qiáng)制類(lèi)型實(shí)現(xiàn)字符串和ASCII碼之間的轉(zhuǎn)換

    這篇文章主要介紹了C#中使用強(qiáng)制類(lèi)型實(shí)現(xiàn)字符串和ASCII碼之間的轉(zhuǎn)換,本文還給出了另一種方法,需要的朋友可以參考下
    2014-08-08
  • C#多線(xiàn)程數(shù)組模擬socket

    C#多線(xiàn)程數(shù)組模擬socket

    這篇文章主要為大家詳細(xì)介紹了C#多線(xiàn)程數(shù)組模擬socket的相關(guān)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • C#圖像處理之頭發(fā)檢測(cè)的方法

    C#圖像處理之頭發(fā)檢測(cè)的方法

    這篇文章主要介紹了C#圖像處理之頭發(fā)檢測(cè)的方法,可實(shí)現(xiàn)針對(duì)圖像中頭發(fā)的檢測(cè)功能,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-04-04
  • 如何在c#中使用opencv函數(shù)庫(kù)

    如何在c#中使用opencv函數(shù)庫(kù)

    這篇文章主要介紹了如何在c#中使用opencv,對(duì)圖像匹配處理感興趣的同學(xué)可以參考下
    2021-04-04

最新評(píng)論

宝鸡市| 洛扎县| 化德县| 绵竹市| 宁津县| 兴和县| 两当县| 庆城县| 麟游县| 溧水县| 乐业县| 建宁县| 罗平县| 泗阳县| 宣城市| 佛冈县| 吴忠市| 平山县| 保定市| 城口县| 湟中县| 民乐县| 襄垣县| 神木县| 康乐县| 白玉县| 乳山市| 分宜县| 即墨市| 建宁县| 太原市| 河津市| 行唐县| 南郑县| 西畴县| 建瓯市| 天祝| 都安| 乃东县| 岳阳市| 特克斯县|