<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      代碼改變世界

      結合項目實例 回顧傳統設計模式(三)裝飾者模式

      2011-10-02 15:09  熬夜的蟲子  閱讀(757)  評論(1)    收藏  舉報

      說到這個模式的項目實例 蟲子也滿頭疼的 所謂裝飾者模式說白了動態將職責附加到對象上。如果你在項目某個場景中需要功能擴展根據基類衍生出非常多的子類,那么裝飾者模式無疑是很好的。不過其實在實際的項目中,往往大家不直接衍生子類,而是通過組合的方式,根據邏輯講各種擴展疊加來,對外公布的只是一個標簽一個殼而已。

      所以這個章節,蟲子就虛構一個實例了。還拿電商來說、點券贈品系統。

      背景:

      1.所有點券、優惠券、贈品券、積分繼承同一個基類 基類券

      2.不用種類的券可以混合搭配

      3.積分根據不同的場景可以配置不同的規則

      4.升級禮券在上層禮券基礎上添加

      一般情況下 大家可以就這樣設計了

      /// <summary>
          
      /// 基卡
          
      /// </summary>
          public abstract class BaseCard
          {      
              public string decription;
              public abstract double cost();
             
          }

          /// <summary>
          
      /// 點卡A
          
      /// </summary>
          public class cardA : BaseCard
          {
              public cardA()
              {
                  decription = "cardA";
              }
              public override double cost()
              {
                  return 50.00;
              }
          }

          /// <summary>
          
      /// 優惠券A
          
      /// </summary>
          public class couponsA : BaseCard
          {
              public couponsA()
              {
                  decription = "couponsA";
              }
              public override double cost()
              {
                  return 40.00;
              }
          }

          /// <summary>
          
      /// 優惠券B
          
      /// </summary>
          public class couponsB : BaseCard
          {
              public couponsB()
              {
                  decription = "couponsB";
              }
              public override double cost()
              {         
                  return 30.00;
              }
          }

          /// <summary>
          
      /// 國慶禮券
          
      /// </summary>
          public class GQCard : BaseCard
          {
              cardA a = new cardA();
              couponsA ca = new couponsA();
              public GQCard()
              {
                  decription = "GQCard";
              }
              public override double cost()
              {
                  return a.cost() + ca.cost();
              }
          }

          /// <summary>
          
      /// 國慶升級A等禮券
          
      /// </summary>
          public class GQACard : BaseCard
          {
              cardA a = new cardA();
              couponsA ca = new couponsA();
              couponsB cb = new couponsB();
              public GQACard()
              {
                  decription = "GQACard";
              }
              public override double cost()
              {
                  return a.cost() +ca.cost()+ cb.cost();
              }
          }

       

      設計模式的原則是類應該對擴展開放對修改關閉,而上述設計在禮券升級種類越來越多的情況下并且現有的禮券已經頻繁更新的話 對于龐大的禮券系統肯定是不理想的

      那么我們換個思路

       

      /// <summary>
          
      /// 基卡
          
      /// </summary>
          public abstract class BaseCard
          {      
              public string decription;
              public abstract double cost();
             
          }

          /// <summary>
          
      /// 點卡A
          
      /// </summary>
          public class cardA : baseoupons
          {
              BaseCard basec;
              public cardA(BaseCard basec)
              {
                  this.basec = basec;
                  decription = "cardA," + basec.decription;
              }
              public override double cost()
              {
                  return 50.00 + basec.cost(); 
              }
          }

          /// <summary>
          
      /// 優惠券A
          
      /// </summary>
          public class couponsA : baseoupons
          {
              BaseCard basec;
              public couponsA(BaseCard basec)
              {
                  this.basec = basec;
                  decription = "couponsA," + basec.decription;
              }
              public override double cost()
              {
                  return 40.00 + basec.cost();
              }
          }

          /// <summary>
          
      /// 優惠券B
          
      /// </summary>
          public class couponsB : baseoupons
          {
              BaseCard basec;
              public couponsB(BaseCard basec)
              {
                  this.basec = basec;
                  decription = "couponsB," + basec.decription;
              }
              public override double cost()
              {
                  return 30.00 + basec.cost(); 
              }
          }

          /// <summary>
          
      /// 基類禮券
          
      /// </summary>
          public class baseoupons : BaseCard
          {
              BaseCard basec;
              public baseoupons(BaseCard basec)
              {
                  this.basec = basec;
                  decription = basec.decription;
              }
              public baseoupons()
              {
                  
              }
              public override double cost()
              {
                  if (basec != null)
                  {
                      return basec.cost();
                  }
                  else
                  {
                      return 0;
                  }
              }
            
          }

       

       讓我們看看裝飾者模式的強大

       

        BaseCard a = new baseoupons();
                  a = new cardA(a);
                  a = new couponsA(a);
                  a = new couponsB(a);

                  Console.WriteLine("國慶禮券由"+a.decription+"組成");
                  Console.WriteLine(a.cost().ToString());

                  BaseCard b = new cardA(a);
                 
                  Console.WriteLine("國慶升級禮券由" + b.decription + "組成");
                  Console.WriteLine(b.cost().ToString());
                  Console.ReadLine();

       

      總結:繼承屬于擴展形式之一,但不見得是達到彈性設計的最佳方式,在我們的設計當中應該允許行為可以被擴展,而無需修改現有的代碼。就如上述的例子裝飾者模式也可以讓我們擴展行為。不過裝飾者模式也有缺點,它會導致設計中出現許多小對象,如果過度使用,會讓程序變得很復雜。

       

      主站蜘蛛池模板: 亚洲乱码日产精品一二三| 国产精品一区二区黄色片| 嘉义市| 国产AV永久无码青青草原| 国产午夜福利不卡在线观看| 中文字幕人妻有码久视频| 国产精品综合av一区二区| 亚洲综合一区二区三区| 国产AV无码专区亚洲AWWW| 国产精品毛片在线看不卡| 在线观看AV永久免费| 芜湖市| 亚洲综合av永久无码精品一区二区| 亚洲精品日韩在线丰满| 亚洲国产午夜福利精品| 国产一区二区日韩经典| 亚洲国产精品综合久久网络| 国产亚洲精品在天天在线麻豆| 国产精品扒开腿做爽爽爽a片唱戏| 亚洲av日韩av一区久久| 亚洲日韩成人无码不卡网站| 靖江市| 亚洲免费成人av一区| 亚洲国产精品久久久天堂麻豆宅男| 男女扒开双腿猛进入爽爽免费看| 精品人人妻人人澡人人爽人人 | 久青草国产在视频在线观看| 国产精品无码专区| 高清欧美性猛交xxxx黑人猛交| 精品亚洲香蕉久久综合网| 亚洲精品动漫免费二区| 欧美乱妇高清无乱码免费| 成人亚洲欧美一区二区三区| 国产高清在线精品一区不卡| 18岁日韩内射颜射午夜久久成人| 国产乱子伦一区二区三区四区五区| 国产自产视频一区二区三区| 双乳奶水饱满少妇呻吟免费看| 巨胸美乳无码人妻视频漫画| 韩国主播av福利一区二区| 亚洲国产日韩欧美一区二区三区|