<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在房子裝修的過程中,各種功能可以相互組合,來增加房子的功用。類似的,如果我們在軟體系統中,要給某個型別或者物件增加功能,如果使用“繼承”的方案來寫程式碼,就會出現子類暴漲的情況。比如:IMarbleStyle是大理石風格的一個功能,IKeepWarm是保溫的一個介面定義,IHouseSecurity是房子安全的一個介面,就三個介面來說,House是我們房子,我們的房子要什麼功能就實現什麼介面,如果房子要的是複合功能,介面不同的組合就有不同的結果,這樣就導致我們子類膨脹嚴重,如果需要在增加功能,子類會成指數增長。這個問題的根源在於我們“過度地使用了繼承來擴充套件物件的功能”,由於繼承為型別引入的靜態特質(所謂靜態特質,就是說如果想要某種功能,我們必須在編譯的時候就要定義這個類,這也是強型別語言的特點。靜態,就是指在編譯的時候要確定的東西;動態,是指執行時確定的東西),使得這種擴充套件方式缺乏靈活性;並且隨著子類的增多(擴充套件功能的增多),各種子類的組合(擴充套件功能的組合)會導致更多子類的膨脹(多繼承)。如何使“物件功能的擴充套件”能夠根據需要來動態(即執行時)地實現?同時避免“擴充套件功能的增多”帶來的子類膨脹問題?從而使得任何“功能擴充套件變化”所導致的影響降為最低?
動態地給一個物件增加一些額外的職責。就增加功能而言,Decorator模式比生成子類更為靈活。 —— 《設計模式》GoF
在裝飾模式中的各個角色有:
(1)、抽象構件角色(Component):給出一個抽象介面,以規範準備接收附加責任的物件。
(2)、具體構件角色(Concrete Component):定義一個將要接收附加責任的類。
(3)、裝飾角色(Decorator):持有一個構件(Component)物件的範例,並實現一個與抽象構件介面一致的介面。
(4)、具體裝飾角色(Concrete Decorator):負責給構件物件新增上附加的責任。
繼續拿蓋房子來說事吧。
/// <summary> /// 該抽象類就是房子抽象介面的定義,該型別就相當於是Component型別,是餃子餡,需要裝飾的,需要包裝的 /// </summary> public abstract class House { public abstract void Renovation();//房子的裝修方法--該操作相當於Component型別的Operation方法 } /// <summary> /// 該抽象類就是裝飾介面的定義,該型別就相當於是Decorator型別,如果需要具體的功能,可以子類化該型別 /// </summary> public abstract class DecorationStrategy : House //關鍵點之二,體現關係為Is-a,有這這個關係,裝飾的類也可以繼續裝飾了 { //通過組合方式參照Decorator型別,該型別實施具體功能的增加這是關鍵點之一,包含關係,體現為Has-a protected House _house; protected DecorationStrategy(House house)//通過構造器注入,初始化平臺實現 { this._house = house; } public override void Renovation() //該方法就相當於Decorator型別的Operation方法 { if (this._house != null) { this._house.Renovation(); } } } /// <summary> /// PatrickLiu的房子,我要按我的要求做房子,相當於ConcreteComponent型別,這就是我們具體的餃子餡,我個人比較喜歡韭菜餡 /// </summary> public sealed class MyHouse : House { public override void Renovation() { Console.WriteLine("裝修PatrickLiu的房子"); } } /// <summary> /// 具有安全功能的裝置,可以提供監視和報警功能,相當於ConcreteDecoratorA型別 /// </summary> public sealed class HouseSecurityDecorator : DecorationStrategy { public HouseSecurityDecorator(House house) : base(house) { } public override void Renovation() { base.Renovation(); Console.WriteLine("增加安全系統"); } } /// <summary> /// 具有保溫介面的材料,提供保溫功能,相當於ConcreteDecoratorB型別 /// </summary> public sealed class KeepWarmDecorator : DecorationStrategy { public KeepWarmDecorator(House house) : base(house) { } public override void Renovation() { base.Renovation(); Console.WriteLine("增加保溫的功能"); } } public class Program { static void Main() { House myselfHouse = new MyHouse();//這就是我們的餃子餡,需要裝飾的房子 DecorationStrategy securityHouse = new HouseSecurityDecorator(myselfHouse); securityHouse.Renovation(); //房子就有了安全系統了 //如果我既要安全系統又要保暖呢,繼續裝飾就行 DecorationStrategy securityAndWarmHouse = new HouseSecurityDecorator(securityHouse); securityAndWarmHouse.Renovation(); } }
在Net框架中,有一個型別很明顯的使用了“裝飾模式”,這個型別就是Stream。Stream型別是一個抽象介面,它在System.IO名稱空間裡面,它其實就是Component。FileStream、NetworkStream、MemoryStream都是實體類ConcreteComponent。右邊的BufferedStream、CryptoStream是裝飾物件,它們都是繼承了Stream介面的。
如圖:
Stream就相當於Component,定義裝飾的物件,FileStream就是要裝飾的物件,BufferedStream是裝飾物件。我們看看BufferedStream的定義,部分定義了。
public sealed class BufferedStream : Stream { private const int _DefaultBufferSize = 4096; private Stream _stream; }
到此這篇關於.Net結構型設計模式之裝飾模式(Decorator)的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45