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

C#設計模式實現之生成器模式和責任鏈模式

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

生成器

生成器模式:封裝一個產品的構造過程,并允許按步驟構造。

現又一個度假計劃指定,需要指定度假每一天的活動、旅館、用餐、門票等等事情,但是每個客人的度假計劃可能不太一樣。例如天數、活動類型、用餐等等。

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

設計類圖:

 實現代碼:

①存儲數據結構類

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

③具體生成器,具體生成器可以多個實現。

     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)點:

1、將復雜對象創(chuàng)建過程封裝起來。

2、允許對象通過多個步驟來創(chuàng)建,并且可以改變過程。

3、向客戶隱藏產品內部表現。

4、產品的實現可以被替換,因為客戶只看到一個抽象的接口。

用途與缺點:

1、經常用來創(chuàng)建組合結構。

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

責任鏈

責任鏈模式:讓一個以上的對象有機會能夠處理某個請求的時候,就使用責任鏈模式。

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

設計類圖:

實現代碼:

①責任鏈抽象類

     /// <summary>
     /// 郵件類型
     /// </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);
         
     }

②責任鏈處理類

     /// <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>
     /// 轉發(fā)經理
     /// </summary>
     class ManagerHandler : Handler
     {
         public ManagerHandler() : base(EmailType.Manager)
         {
         }
 
         public override void HandleRequest(EmailType requsetType)
         {
             if (EmailType.Manager == requsetType)
             {
                 Console.WriteLine("郵件轉到經理處理");
             }
             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);
                 }
             }
         }
     }

③測試責任鏈

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

優(yōu)點:

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

2、簡化對象,因為不需要知道鏈的結構。

3、通過改變鏈內的成員或調動他們的次序,允許你動態(tài)地新增或者刪除責任。

用途和缺點:

1、經常被用在窗口系統(tǒng)中,處理鼠標和鍵盤之類的事件。

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

3、不容易觀察允許特征,不好排查問題。

總結

到此這篇關于C#設計模式實現之生成器模式和責任鏈模式的文章就介紹到這了,更多相關C#生成器模式和責任鏈模式內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 積累Visual Studio 常用快捷鍵的動畫演示

    積累Visual Studio 常用快捷鍵的動畫演示

    在代碼開發(fā)過程中,頻繁的使用鍵盤、鼠標操作非常麻煩,影響程序的開發(fā)效率。如何操作能用鍵盤來操作,那就節(jié)省時間了。下面小編把我平時積累的有關visul studio 常用快捷鍵的動畫演示分享給大家,僅供大家參考
    2015-10-10
  • C#中abstract的用法詳解

    C#中abstract的用法詳解

    abstract可以用來修飾類,方法,屬性,索引器和時間,這里不包括字段. 使用abstrac修飾的類,該類只能作為其他類的基類,不能實例化,而且abstract修飾的成員在派生類中必須全部實現,不允許部分實現,否則編譯異常
    2016-12-12
  • C#與C++枚舉的區(qū)別對比和使用案例

    C#與C++枚舉的區(qū)別對比和使用案例

    本文詳細講解了C#與C++枚舉的區(qū)別對比和使用案例,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • C#實現文件讀寫到SQLite數據庫

    C#實現文件讀寫到SQLite數據庫

    這篇文章主要為大家詳細介紹了使用?C#?將文件讀寫到?SQLite?數據庫的幾種方法,文中的示例代碼講解詳細,感興趣的小伙伴可以參考一下
    2025-01-01
  • c# 繼承快速入門

    c# 繼承快速入門

    這篇文章主要介紹了c# 繼承快速入門的相關資料,幫助大家更好的理解和學習使用c#,感興趣的朋友可以了解下
    2021-03-03
  • C# using()的使用方法

    C# using()的使用方法

    本文主要介紹了C# using()的使用方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-02-02
  • C# MVC 微信支付教程系列之公眾號支付代碼

    C# MVC 微信支付教程系列之公眾號支付代碼

    本篇文章主要介紹了C# MVC 微信支付教程系列之公眾號支付代碼,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • WPF實現類似360安全衛(wèi)士界面的程序源碼分享

    WPF實現類似360安全衛(wèi)士界面的程序源碼分享

    最近在網上看到了新版的360安全衛(wèi)士,感覺界面還不錯,于是用WPF制作了一個,時間有限,一些具體的控件沒有制作,用圖片代替了。感興趣的朋友一起跟著小編學習WPF實現類似360安全衛(wèi)士界面的程序源碼分享
    2015-09-09
  • 詳解C#中的string與String

    詳解C#中的string與String

    本篇文章主要對jC#中的小寫string與大寫String進行詳細介紹,相信對大家學習會有很好的幫助,需要的朋友一起來看下吧
    2016-12-12
  • C#發(fā)送內置圖片html格式郵件的方法

    C#發(fā)送內置圖片html格式郵件的方法

    這篇文章主要介紹了C#發(fā)送內置圖片html格式郵件的方法,涉及C#發(fā)送郵件的技巧,非常具有實用價值,需要的朋友可以參考下
    2015-04-04

最新評論

阳城县| 乐都县| 永嘉县| 牡丹江市| 辽宁省| 二连浩特市| 谢通门县| 龙井市| 驻马店市| 大洼县| 汉阴县| 江川县| 望谟县| 临猗县| 陆丰市| 什邡市| 永昌县| 广河县| 缙云县| 甘孜县| 赞皇县| 滨海县| 木兰县| 泰和县| 湖南省| 镇坪县| 鸡泽县| 仪征市| 东乌| 廊坊市| 玉树县| 凯里市| 连城县| 望奎县| 清水县| 望城县| 滁州市| 浪卡子县| 甘孜| 全州县| 探索|