日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

设计模式篇——初探装饰器模式

發布時間:2025/3/15 asp.net 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式篇——初探装饰器模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

1、裝飾器模式介紹

2、裝飾器模式類圖

3、裝飾器模式Demo實現(一個小鎮的拉面館)

4、裝飾器模式總結

裝飾器模式介紹:裝飾器模式可以在不修改任何底層代碼的情況下,給對象賦予新的職責(程序運行時的擴展,動態的將責任附加到對象上)。屬于結構型設計模式。

類圖:

我們來看下裝飾器模式的類圖:

  

一個簡單的Demo(故鄉小鎮的一個面館):

  

?

? 在故鄉的一個小鎮上面,有一家面館,主營拉面。在這里你可以只點清湯面(SoupNoodle),也可以往里面加佐料,佐料有牛肉(Beef),魚丸(FishBall)還有菠菜(Spinach)。面館今天開張了。

? 這里的所有面條都基于一個抽象類BaseNoodle來實現,這個抽象類有兩個抽象方法,獲取它的價格(double?Price()),獲取它的名字(string GetName())。

1 /// <summary> 2 /// 面條抽象類 3 /// </summary> 4 public abstract class BaseNoodle 5 { 6 /// <summary> 7 /// 價格 8 /// </summary> 9 /// <returns></returns> 10 public abstract double Price(); 11 /// <summary> 12 /// 獲取名稱 13 /// </summary> 14 /// <returns></returns> 15 public abstract string GetName(); 16 } BaseNoodle

? ?然后讓我們實現下我們最基礎的清湯面(SoupNoodle),清湯面的價格是1塊錢(嗯,還蠻實惠的)

1 /// <summary> 2 /// 清湯面 3 /// </summary> 4 public class SoupNoodle : BaseNoodle 5 { 6 private static double cost = 1; 7 public override string GetName() 8 { 9 return "清湯面"; 10 } 11 public override double Price() 12 { 13 return cost; 14 } 15 } SoupNoodle

? 這時候,我們來了第一位客人(張三),他要一碗帶牛肉作料的清湯面

于是乎,我們就實現了這樣一個類。

1 public class SoupNoodleWithBeef : BaseNoodle 2 { 3 private static double cost = 1; 4 public override string GetName() 5 { 6 return "清湯面" + ",牛肉"; 7 } 8 /// <summary> 9 /// 假設牛肉一份0.6元 10 /// </summary> 11 /// <returns></returns> 12 public override double Price() 13 { 14 return cost + 0.6; 15 } 16 } SoupNoodleWithBeef

然后第二個客人進來了,是個可愛的小姑娘,她要一份加菠菜的清湯面。于是乎,我們又要實現這樣一個類。

?

1 public class SoupNoodleWithSpinach : BaseNoodle 2 { 3 private static double cost = 1; 4 public override string GetName() 5 { 6 return "清湯面" + ",菠菜"; 7 } 8 /// <summary> 9 /// 假設菠菜一份0.2元 10 /// </summary> 11 /// <returns></returns> 12 public override double Price() 13 { 14 return cost + 0.2; 15 } 16 } SoupNoodleWithSpinach

我們一共有三種佐料,假設客人的口味都不同,那樣的話我們需要多少個繼承自BaseNoodle的子類呢? 沒錯,應該是A(3,3)個6個子類。這樣顯然不行,假如我們后期有添加了新的佐料,蝦球,那樣我們的子類個數就是24個,況且誰又能保證客人只點一份相同的佐料呢?假如點兩份牛肉呢?我們的子類個數將呈現指數級別的增長。。。

這時候我們的裝飾器模式就登場了。

? 還是我們的面條基類抽象類,和清湯面(被裝飾者)類,在這個的基礎之上我們將不再寫很多針對細節的子類。我們首先實現一個佐料抽象類(SeasoningDecorator),這個抽象類也要繼承自BaseNoodle。它內部有一個實例變量=》BaseNoodle

1 /// <summary> 2 /// 基礎佐料類 3 /// </summary> 4 public abstract class SeasoningDecorator : BaseNoodle 5 { 6 private BaseNoodle _baseNoodle = null; 7 public SeasoningDecorator(BaseNoodle baseNoodle) 8 { 9 _baseNoodle = baseNoodle; 10 } 11 12 public override string GetName() 13 { 14 return this._baseNoodle.GetName(); 15 } 16 17 public override double Price() 18 { 19 return this._baseNoodle.Price(); 20 } 21 } SeasoningDecorator

? 此時,我們定義我們的具體佐料類,這些佐料類都繼承自SeasoningDecorator,而且內部都存在一個實例變量=》BaseNoodle。

1 /// <summary> 2 /// 牛肉 3 /// </summary> 4 public class BeefDecorator: SeasoningDecorator 5 { 6 private static double cost = 0.6; 7 private BaseNoodle _baseNoodle = null; 8 public BeefDecorator(BaseNoodle baseNoodle) : base(baseNoodle) 9 { 10 _baseNoodle = baseNoodle; 11 } 12 public override string GetName() 13 { 14 return this._baseNoodle.GetName() + ",牛肉"; 15 } 16 public override double Price() 17 { 18 return this._baseNoodle.Price() + cost; 19 } 20 } BeefDecorator 1 /// <summary> 2 /// 魚丸 3 /// </summary> 4 public class FishBallDecorator : SeasoningDecorator 5 { 6 private static double cost = 0.4; 7 private BaseNoodle _baseNoodle = null; 8 public override string GetName() 9 { 10 return this._baseNoodle.GetName() + ",魚丸"; 11 } 12 public FishBallDecorator(BaseNoodle baseNoodle) : base(baseNoodle) 13 { 14 _baseNoodle = baseNoodle; 15 } 16 public override double Price() 17 { 18 return this._baseNoodle.Price() + cost; 19 } 20 } FishBallDecorator 1 /// <summary> 2 /// 菠菜 3 /// </summary> 4 public class Spinach : SeasoningDecorator 5 { 6 private static double cost = 0.2; 7 private BaseNoodle _baseNoodle = null; 8 public override string GetName() 9 { 10 return this._baseNoodle.GetName() + ",菠菜"; 11 } 12 public Spinach(BaseNoodle baseNoodle) : base(baseNoodle) 13 { 14 _baseNoodle = baseNoodle; 15 } 16 public override double Price() 17 { 18 return this._baseNoodle.Price() + cost; 19 } 20 } Spinach

? 這些具體的佐料類就是我們的裝飾器。因為它構造函數接收一個BaseNoodle,所以我們可以這樣來實現對清湯面(SoupNoodle)的裝飾:

1 //定義清湯面 2 BaseNoodle baseSoupNoodle = new SoupNoodle(); 3 //添加一份牛肉 4 baseSoupNoodle = new BeefDecorator(baseSoupNoodle); 5 //添加一份魚丸 6 baseSoupNoodle = new FishBallDecorator(baseSoupNoodle); 7 //添加一份菠菜 8 baseSoupNoodle = new Spinach(baseSoupNoodle); 9 //再添加一份牛肉 10 baseSoupNoodle = new BeefDecorator(baseSoupNoodle); 11 Console.WriteLine($"點了一份{baseSoupNoodle.GetName()},價格為{baseSoupNoodle.Price()}"); 12 Console.Read(); 點餐

裝飾器模式總結:

  • 裝飾器屬于結構型設計模式,很好的遵循了開閉原則。
  • 裝飾器模式的裝飾者與被裝飾者有相同的超類型。
  • 裝飾器模式可以在程序運行時,以組合的方式,動態的給對象添加行為(因為有相同的超類型,所以任何需要原始對象的場合,都可以用裝飾過的對象去替代它)。
  • 裝飾器模式會出現很多的小的類型。

轉載于:https://www.cnblogs.com/liumengchen-boke/p/8725812.html

總結

以上是生活随笔為你收集整理的设计模式篇——初探装饰器模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 天海翼一区 | 在线免费av片 | 初高中福利视频网站 | 国产在线传媒 | 色成人综合网 | 成人靠逼视频 | 爱情岛论坛亚洲线路一 | 男生插女生的视频 | 欧美精品久久久久 | 国产精品腿扒开做爽爽爽挤奶网站 | 日韩永久| 2020国产精品视频 | 青青艹av | 91福利视频在线 | 久久中文字幕高清 | 在线观看亚洲精品视频 | 91午夜在线 | 波多野结衣福利视频 | 免费中文字幕视频 | 免费在线黄色网址 | 亚洲激情图 | 免费精品国产 | 熟女人妇 成熟妇女系列视频 | 91黄瓜| 国产成人亚洲精品无码h在线 | 1024日韩| 午夜视频在线观看国产 | 成人国产在线视频 | 国产一区二区三区欧美 | 国产视频一区二区三区在线 | 中文字幕在线观看视频一区二区 | 午夜亚洲福利在线老司机 | 中字幕一区二区三区乱码 | 久久经典 | 熟女高潮一区二区三区 | 美女毛片 | 亚洲成人av网址 | 你懂的国产在线 | 国产精品人成在线观看免费 | 日韩经典午夜福利发布 | 国产精品美女久久久久久久 | 99国产视频在线 | 翔田千里在线播放 | 午夜一区在线 | 天堂中文在线免费观看 | 日韩五月天 | 东北少妇av | 亚洲啊啊啊啊啊 | 黄网视频在线观看 | 影音先锋中文字幕第一页 | 欧美bbw视频 | 伊人影院综合 | 男人的天堂黄色 | 操小妹影院 | 日韩大片一区 | 亚洲精品高清无码视频 | 欧美性受xxxx狂喷水 | 成年人国产视频 | 成年精品| 国产综合色视频 | 热播网 | 天天国产视频 | 欧美整片sss | 九九三级 | 又黄又爽的视频 | 任你操精品 | 亚洲AV无码成人精品区麻豆 | 性欧美18 | 美美女高清毛片视频免费观看 | 成年人网站在线观看视频 | 免费看日韩 | 亚洲图片在线视频 | 中文免费av| 日本一区不卡视频 | 97人妻精品一区二区免费 | 五月婷影院 | 无码人妻一区二区三区在线视频 | 午夜精品av | 97视频在线| 久久久线视频 10 | 日韩精品久久久久久 | 成人v片 | 久久99日 | 亚洲黄色激情视频 | 97青青草 | 国产91免费视频 | 国产a一区二区三区 | 在线免费看毛片 | 中文字字幕在线观看 | 国产成人在线观看网站 | 亚洲激情视频网站 | 丝袜美女啪啪 | 日韩精品偷拍 | 色婷婷国产| 自拍偷拍2019 | 就爱操av | 琪琪原网址 | 色妞干网| 成人爱爱网站 |