亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C#設(shè)計(jì)模式實(shí)現(xiàn)之生成器模式和責(zé)任鏈模式

 更新時(shí)間:2021年08月17日 11:05:19   作者:SpringSun  
學(xué)完設(shè)計(jì)模式之后,你就感覺(jué)它會(huì)慢慢地影響到你寫(xiě)代碼的思維方式,下面這篇文章主要給大家介紹了關(guān)于C#設(shè)計(jì)模式實(shí)現(xiàn)之生成器模式和責(zé)任鏈模式的相關(guān)資料,需要的朋友可以參考下

生成器

生成器模式:封裝一個(gè)產(chǎn)品的構(gòu)造過(guò)程,并允許按步驟構(gòu)造。

現(xiàn)又一個(gè)度假計(jì)劃指定,需要指定度假每一天的活動(dòng)、旅館、用餐、門(mén)票等等事情,但是每個(gè)客人的度假計(jì)劃可能不太一樣。例如天數(shù)、活動(dòng)類(lèi)型、用餐等等。

我們需要一個(gè)彈性的數(shù)據(jù)結(jié)構(gòu),代表客人的規(guī)劃,以及不同的變化,也需要一系列潛在復(fù)雜順序,創(chuàng)建這樣的規(guī)劃。如何提供一種方式來(lái)創(chuàng)建復(fù)雜的結(jié)構(gòu),也不會(huì)和創(chuàng)建它的步驟混在一起。迭代器的過(guò)程就是封裝進(jìn)一個(gè)獨(dú)立的對(duì)象中,向客戶隱藏集合的內(nèi)部表現(xiàn)。這里我們也采用同樣的思路:我們將旅游規(guī)劃的創(chuàng)建過(guò)程,封裝到一個(gè)對(duì)象中(此對(duì)象稱(chēng)為生成器),然后讓客戶調(diào)用生成器為它創(chuàng)建旅游規(guī)劃。

設(shè)計(jì)類(lèi)圖:

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

①存儲(chǔ)數(shù)據(jù)結(jié)構(gòu)類(lèi)

     public class Vacation
     {
         public int Day { get; set; }
         public string Hotel { get; set; }
         public string Park { get; set; }
         public string Activity { get; set; }
         public string Meal { get; set; }
     }

②抽象生成器

     public abstract class AbstractBuilder
     {
         public abstract void BuildDay(int day);
         public abstract void Hotel(string hotel);
         public abstract void Park(string park);
        public abstract void Activity(string activity);
         public abstract void Meal(string meal);
         public abstract Vacation GetVacationPlanner();
     }

③具體生成器,具體生成器可以多個(gè)實(shí)現(xiàn)。

     public class VacationBuilder : AbstractBuilder
     {
         private Vacation vacation=new Vacation();
 
         public override void BuildDay(int day)
         {
             vacation.Day = day;
         }
 
         public override void Hotel(string hotel)
         {
             vacation.Hotel = hotel;
         }
         public override void Activity(string activity)
         {
             vacation.Activity = activity;
         }
         public override void Meal(string meal)
         {
             vacation.Meal = meal;
         }
 
         public override void Park(string park)
         {
             vacation.Park = park;
         }
 
         public override Vacation GetVacationPlanner()
         {
             return vacation;
         }
     }

④客戶使用生成器

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

1、將復(fù)雜對(duì)象創(chuàng)建過(guò)程封裝起來(lái)。

2、允許對(duì)象通過(guò)多個(gè)步驟來(lái)創(chuàng)建,并且可以改變過(guò)程。

3、向客戶隱藏產(chǎn)品內(nèi)部表現(xiàn)。

4、產(chǎn)品的實(shí)現(xiàn)可以被替換,因?yàn)榭蛻糁豢吹揭粋€(gè)抽象的接口。

用途與缺點(diǎn):

1、經(jīng)常用來(lái)創(chuàng)建組合結(jié)構(gòu)。

2、與工廠模式相比,采用生成器創(chuàng)建對(duì)象的客戶需要更多的領(lǐng)域知識(shí),才能正確的創(chuàng)建對(duì)象。

責(zé)任鏈

責(zé)任鏈模式:讓一個(gè)以上的對(duì)象有機(jī)會(huì)能夠處理某個(gè)請(qǐng)求的時(shí)候,就使用責(zé)任鏈模式。

有這樣一個(gè)場(chǎng)景,公司專(zhuān)門(mén)接受郵件處理的人員需要將每天接收到的郵件進(jìn)行處理,一類(lèi)是需要轉(zhuǎn)給部門(mén)經(jīng)理處理的郵件,一類(lèi)是給自己處理的,還有一類(lèi)垃圾郵件直接刪除。如果這樣的一個(gè)場(chǎng)景,我們就可以通過(guò)責(zé)任鏈模式,為處理創(chuàng)建一個(gè)對(duì)象鏈。每個(gè)對(duì)象依序檢查郵件請(qǐng)求,并進(jìn)行處理,或者將它傳遞給鏈中的下一個(gè)對(duì)象。

設(shè)計(jì)類(lèi)圖:

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

①責(zé)任鏈抽象類(lèi)

     /// <summary>
     /// 郵件類(lèi)型
     /// </summary>
     public enum EmailType
     {
         Self=1,
         Manager=2,
         Del=3
     }
 
 
     public abstract class Handler
     {
         public Handler nextHandler;
         public EmailType type;
 
         public Handler(EmailType type) {
             this.type = type;
         }
 
         public void SetNextHandler(Handler nextHandler)
         {
             this.nextHandler = nextHandler;
         }
 
         public abstract void HandleRequest(EmailType requsetType);
         
     }

②責(zé)任鏈處理類(lèi)

     /// <summary>
     /// 自己處理
     /// </summary>
     class SelfHandler : Handler
     {
         public SelfHandler() : base(EmailType.Self)
         {
         }
 
         public override void HandleRequest(EmailType requsetType)
         {
             if (EmailType.Self == requsetType)
             {
                 Console.WriteLine("郵件由自己處理");
             }
             else
             {
                 if (nextHandler != null)
                 {
                     nextHandler.HandleRequest(requsetType);
                 }
             }
         }
     }
     /// <summary>
     /// 轉(zhuǎn)發(fā)經(jīng)理
     /// </summary>
     class ManagerHandler : Handler
     {
         public ManagerHandler() : base(EmailType.Manager)
         {
         }
 
         public override void HandleRequest(EmailType requsetType)
         {
             if (EmailType.Manager == requsetType)
             {
                 Console.WriteLine("郵件轉(zhuǎn)到經(jīng)理處理");
             }
             else
             {
                 if (nextHandler != null)
                 {
                     nextHandler.HandleRequest(requsetType);
                 }
             }
         }
     }
     /// <summary>
     /// 刪除垃圾郵件
     /// </summary>
     class DelHandler : Handler
     {
         public DelHandler() : base(EmailType.Del)
         {
         }
 
         public override void HandleRequest(EmailType requsetType)
         {
             if (EmailType.Del == requsetType)
             {
                 Console.WriteLine("垃圾郵件已刪除");
             }
             else
             {
                 if (nextHandler != null)
                 {
                     nextHandler.HandleRequest(requsetType);
                 }
             }
         }
     }

③測(cè)試責(zé)任鏈

     class Program
     {
         static void Main(string[] args)
         {
             //組裝責(zé)任鏈
             Handler handler = new SelfHandler();
             Handler handler1 = new ManagerHandler();
             Handler handler2 = new DelHandler();
             handler.SetNextHandler(handler1);
             handler1.SetNextHandler(handler2);
             //測(cè)試
             handler.HandleRequest(EmailType.Del);
             handler.HandleRequest(EmailType.Manager);
             handler.HandleRequest(EmailType.Self);
 
             Console.ReadKey();
         }
     }

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

1、請(qǐng)求的發(fā)送者和接收者解耦。

2、簡(jiǎn)化對(duì)象,因?yàn)椴恍枰梨湹慕Y(jié)構(gòu)。

3、通過(guò)改變鏈內(nèi)的成員或調(diào)動(dòng)他們的次序,允許你動(dòng)態(tài)地新增或者刪除責(zé)任。

用途和缺點(diǎn):

1、經(jīng)常被用在窗口系統(tǒng)中,處理鼠標(biāo)和鍵盤(pán)之類(lèi)的事件。

2、并不保證請(qǐng)求一定被執(zhí)行,如果沒(méi)有任何對(duì)象處理它,可能會(huì)落到鏈尾端之外。

3、不容易觀察允許特征,不好排查問(wèn)題。

總結(jié)

到此這篇關(guān)于C#設(shè)計(jì)模式實(shí)現(xiàn)之生成器模式和責(zé)任鏈模式的文章就介紹到這了,更多相關(guān)C#生成器模式和責(zé)任鏈模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • WinForm實(shí)現(xiàn)攔截窗體上各個(gè)部位的點(diǎn)擊特效實(shí)例

    WinForm實(shí)現(xiàn)攔截窗體上各個(gè)部位的點(diǎn)擊特效實(shí)例

    這篇文章主要介紹了WinForm實(shí)現(xiàn)攔截窗體上各個(gè)部位的點(diǎn)擊特效實(shí)例,對(duì)窗體上各個(gè)部位進(jìn)行定義,從而實(shí)現(xiàn)了點(diǎn)擊特效,需要的朋友可以參考下
    2014-09-09
  • 利用C#版OpenCV實(shí)現(xiàn)圓心求取實(shí)例代碼

    利用C#版OpenCV實(shí)現(xiàn)圓心求取實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于如何利用C#版OpenCV實(shí)現(xiàn)圓心求取的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • c#設(shè)計(jì)模式 適配器模式詳細(xì)介紹

    c#設(shè)計(jì)模式 適配器模式詳細(xì)介紹

    結(jié)構(gòu)模式(Structural Pattern)描述如何將類(lèi)或者對(duì)象結(jié)合在一起形成更大的結(jié)構(gòu)。結(jié)構(gòu)模式描述兩種不同的東西:類(lèi)與類(lèi)的實(shí)例。根據(jù)這一點(diǎn),結(jié)構(gòu)模式可以分為類(lèi)的結(jié)構(gòu)模式和對(duì)象的結(jié)構(gòu)模式
    2012-10-10
  • c#中合并excel表格的方法示例

    c#中合并excel表格的方法示例

    本篇文章主要介紹了c#中合并excel表格的方法,就是將excel表格結(jié)構(gòu)一樣的合并到一起,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2016-10-10
  • C#多線程系列之讀寫(xiě)鎖

    C#多線程系列之讀寫(xiě)鎖

    本文詳細(xì)講解了C#多線程的讀寫(xiě)鎖,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02
  • C#流程控制詳解

    C#流程控制詳解

    這篇文章主要介紹了C#流程控制詳解,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-07-07
  • C#實(shí)現(xiàn)為一張大尺寸圖片創(chuàng)建縮略圖的方法

    C#實(shí)現(xiàn)為一張大尺寸圖片創(chuàng)建縮略圖的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)為一張大尺寸圖片創(chuàng)建縮略圖的方法,涉及C#創(chuàng)建縮略圖的相關(guān)圖片操作技巧,需要的朋友可以參考下
    2015-06-06
  • C# Random類(lèi)的正確應(yīng)用方法

    C# Random類(lèi)的正確應(yīng)用方法

    這篇文章主要介紹了C# Random類(lèi)的正確應(yīng)用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • 淺談C#中的string駐留池

    淺談C#中的string駐留池

    這篇文章主要介紹了C#中的string駐留池的的相關(guān)資料,文中示例代碼非常細(xì)致,供大家參考和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • 淺析C#靜態(tài)類(lèi),靜態(tài)構(gòu)造函數(shù),靜態(tài)變量

    淺析C#靜態(tài)類(lèi),靜態(tài)構(gòu)造函數(shù),靜態(tài)變量

    這篇文章主要介紹了淺析C#靜態(tài)類(lèi),靜態(tài)構(gòu)造函數(shù),靜態(tài)變量 的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-06-06

最新評(píng)論