C#設(shè)計模式實現(xiàn)之生成器模式和責任鏈模式
生成器
生成器模式:封裝一個產(chǎn)品的構(gòu)造過程,并允許按步驟構(gòu)造。
現(xiàn)又一個度假計劃指定,需要指定度假每一天的活動、旅館、用餐、門票等等事情,但是每個客人的度假計劃可能不太一樣。例如天數(shù)、活動類型、用餐等等。
我們需要一個彈性的數(shù)據(jù)結(jié)構(gòu),代表客人的規(guī)劃,以及不同的變化,也需要一系列潛在復(fù)雜順序,創(chuàng)建這樣的規(guī)劃。如何提供一種方式來創(chuàng)建復(fù)雜的結(jié)構(gòu),也不會和創(chuàng)建它的步驟混在一起。迭代器的過程就是封裝進一個獨立的對象中,向客戶隱藏集合的內(nèi)部表現(xiàn)。這里我們也采用同樣的思路:我們將旅游規(guī)劃的創(chuàng)建過程,封裝到一個對象中(此對象稱為生成器),然后讓客戶調(diào)用生成器為它創(chuàng)建旅游規(guī)劃。
設(shè)計類圖:
實現(xiàn)代碼:
①存儲數(shù)據(jù)結(jié)構(gòu)類
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(); }
③具體生成器,具體生成器可以多個實現(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)點:
1、將復(fù)雜對象創(chuàng)建過程封裝起來。
2、允許對象通過多個步驟來創(chuàng)建,并且可以改變過程。
3、向客戶隱藏產(chǎn)品內(nèi)部表現(xiàn)。
4、產(chǎn)品的實現(xiàn)可以被替換,因為客戶只看到一個抽象的接口。
用途與缺點:
1、經(jīng)常用來創(chuàng)建組合結(jié)構(gòu)。
2、與工廠模式相比,采用生成器創(chuàng)建對象的客戶需要更多的領(lǐng)域知識,才能正確的創(chuàng)建對象。
責任鏈
責任鏈模式:讓一個以上的對象有機會能夠處理某個請求的時候,就使用責任鏈模式。
有這樣一個場景,公司專門接受郵件處理的人員需要將每天接收到的郵件進行處理,一類是需要轉(zhuǎn)給部門經(jīng)理處理的郵件,一類是給自己處理的,還有一類垃圾郵件直接刪除。如果這樣的一個場景,我們就可以通過責任鏈模式,為處理創(chuàng)建一個對象鏈。每個對象依序檢查郵件請求,并進行處理,或者將它傳遞給鏈中的下一個對象。
設(shè)計類圖:
實現(xiàn)代碼:
①責任鏈抽象類
/// <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> /// 轉(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); } } } }
③測試責任鏈
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、簡化對象,因為不需要知道鏈的結(jié)構(gòu)。
3、通過改變鏈內(nèi)的成員或調(diào)動他們的次序,允許你動態(tài)地新增或者刪除責任。
用途和缺點:
1、經(jīng)常被用在窗口系統(tǒng)中,處理鼠標和鍵盤之類的事件。
2、并不保證請求一定被執(zhí)行,如果沒有任何對象處理它,可能會落到鏈尾端之外。
3、不容易觀察允許特征,不好排查問題。
總結(jié)
到此這篇關(guān)于C#設(shè)計模式實現(xiàn)之生成器模式和責任鏈模式的文章就介紹到這了,更多相關(guān)C#生成器模式和責任鏈模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
WinForm實現(xiàn)攔截窗體上各個部位的點擊特效實例
這篇文章主要介紹了WinForm實現(xiàn)攔截窗體上各個部位的點擊特效實例,對窗體上各個部位進行定義,從而實現(xiàn)了點擊特效,需要的朋友可以參考下2014-09-09C#實現(xiàn)為一張大尺寸圖片創(chuàng)建縮略圖的方法
這篇文章主要介紹了C#實現(xiàn)為一張大尺寸圖片創(chuàng)建縮略圖的方法,涉及C#創(chuàng)建縮略圖的相關(guān)圖片操作技巧,需要的朋友可以參考下2015-06-06淺析C#靜態(tài)類,靜態(tài)構(gòu)造函數(shù),靜態(tài)變量
這篇文章主要介紹了淺析C#靜態(tài)類,靜態(tài)構(gòu)造函數(shù),靜態(tài)變量 的相關(guān)資料,非常不錯具有參考借鑒價值,需要的朋友可以參考下2016-06-06