生成器

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

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



          ?

          ?

          ?


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

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



          ?

          ?

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

          ①存儲數(shù)據(jù)結(jié)構(gòu)類
          1 public class Vacation 2 { 3 public int Day { get; set; } 4 public string
          Hotel {get; set; } 5 public string Park { get; set; } 6 public string Activity {
          get; set; } 7 public string Meal { get; set; } 8 }
          ②抽象生成器
          1 public abstract class AbstractBuilder 2 { 3 public abstract void BuildDay(
          int day); 4 public abstract void Hotel(string hotel); 5 public abstract void
          Park(string park); 6 public abstract void Activity(string activity); 7 public
          abstract void Meal(string meal); 8 public abstract Vacation
          GetVacationPlanner();9 }
          ③具體生成器,具體生成器可以多個(gè)實(shí)現(xiàn)。
          1 public class VacationBuilder : AbstractBuilder 2 { 3 private Vacation
          vacation=new Vacation(); 4 5 public override void BuildDay(int day) 6 { 7
          vacation.Day = day; 8 } 9 10 public override void Hotel(string hotel) 11 {
          12 vacation.Hotel = hotel; 13 } 14 public override void Activity(string
          activity)15 { 16 vacation.Activity = activity; 17 } 18 public override void
          Meal(string meal) 19 { 20 vacation.Meal = meal; 21 } 22 23 public override
          void Park(string park) 24 { 25 vacation.Park = park; 26 } 27 28 public
          override Vacation GetVacationPlanner() 29 { 30 return vacation; 31 } 32 }
          ④客戶使用生成器



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

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

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

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

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

          用途與缺點(diǎn):

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

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

          責(zé)任鏈

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


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

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



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

          ?①責(zé)任鏈抽象類
          1 /// <summary> 2 /// 郵件類型 3 /// </summary> 4 public enum EmailType 5 {
          6 Self=1, 7 Manager=2, 8 Del=3 9 } 10 11 12 public abstract class Handler 13
          {14 public Handler nextHandler; 15 public EmailType type; 16 17 public
          Handler(EmailType type) {18 this.type = type; 19 } 20 21 public void
          SetNextHandler(Handler nextHandler)22 { 23 this.nextHandler = nextHandler; 24
          }25 26 public abstract void HandleRequest(EmailType requsetType); 27 28 }
          ②責(zé)任鏈處理類
          1 /// <summary> 2 /// 自己處理 3 /// </summary> 4 class SelfHandler : Handler
          5 { 6 public SelfHandler() : base(EmailType.Self) 7 { 8 } 9 10 public
          override void HandleRequest(EmailType requsetType) 11 { 12 if (EmailType.Self
          == requsetType) 13 { 14 Console.WriteLine("郵件由自己處理"); 15 } 16 else 17 { 18 if
          (nextHandler !=null) 19 { 20 nextHandler.HandleRequest(requsetType); 21 } 22
          }23 } 24 } 1 /// <summary> 2 /// 轉(zhuǎn)發(fā)經(jīng)理 3 /// </summary> 4 class
          ManagerHandler : Handler 5 { 6 public ManagerHandler() : base
          (EmailType.Manager) 7 { 8 } 9 10 public override void
          HandleRequest(EmailType requsetType)11 { 12 if (EmailType.Manager ==
          requsetType)13 { 14 Console.WriteLine("郵件轉(zhuǎn)到經(jīng)理處理"); 15 } 16 else 17 { 18 if
          (nextHandler !=null) 19 { 20 nextHandler.HandleRequest(requsetType); 21 } 22
          }23 } 24 } 1 /// <summary> 2 /// 刪除垃圾郵件 3 /// </summary> 4 class
          DelHandler : Handler 5 { 6 public DelHandler() : base(EmailType.Del) 7 { 8
          } 9 10 public override void HandleRequest(EmailType requsetType) 11 { 12 if
          (EmailType.Del == requsetType) 13 { 14 Console.WriteLine("垃圾郵件已刪除"); 15 } 16
          else 17 { 18 if (nextHandler != null) 19 { 20
          nextHandler.HandleRequest(requsetType);21 } 22 } 23 } 24 }
          ③測試責(zé)任鏈
          1 class Program 2 { 3 static void Main(string[] args) 4 { 5 //組裝責(zé)任鏈 6
          Handler handler =new SelfHandler(); 7 Handler handler1 = new ManagerHandler();
          8 Handler handler2 = new DelHandler(); 9 handler.SetNextHandler(handler1); 10
          handler1.SetNextHandler(handler2);11 //測試 12
          handler.HandleRequest(EmailType.Del);13
          handler.HandleRequest(EmailType.Manager);14
          handler.HandleRequest(EmailType.Self);15 16 Console.ReadKey(); 17 } 18 }


          ?

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

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

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

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

          用途和缺點(diǎn):

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

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

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

          ?

          友情鏈接
          ioDraw流程圖
          API參考文檔
          OK工具箱
          云服務(wù)器優(yōu)惠
          阿里云優(yōu)惠券
          騰訊云優(yōu)惠券
          京東云優(yōu)惠券
          站點(diǎn)信息
          問題反饋
          郵箱:[email protected]
          QQ群:637538335
          關(guān)注微信

                韩国makemodel44人体 | 男女网站在线看 | japanesespank打屁股调教2 | 欧美久久免费 | 中文字幕在线观看av |