定義
?裝飾模式指的是在不必改變原類文件和使用繼承的情況下,動態(tài)地擴展一個對象的功能。(不使用繼承)
結構圖
image.png
- Component為統(tǒng)一接口,也是裝飾類和被裝飾類的基本類型嬉橙。
- ConcreteComponent為具體實現(xiàn)類,也是被裝飾類寥假,他本身是個具有一些功能的完整的類市框。
- Decorator是裝飾類,實現(xiàn)了Component接口的同時還在內部維護了一個ConcreteComponent的實例糕韧,并可以通過構造函數(shù)初始化枫振。而Decorator本身,通常采用默認實現(xiàn)萤彩,他的存在僅僅是一個聲明:我要生產(chǎn)出一些用于裝飾的子類了粪滤。而其子類才是賦有具體裝飾效果的裝飾產(chǎn)品類。
- ConcreteDecorator是具體的裝飾產(chǎn)品類雀扶,每一種裝飾產(chǎn)品都具有特定的裝飾效果杖小。可以通過構造器聲明裝飾哪種類型的ConcreteComponent愚墓,從而對其進行裝飾予权。
例子
https://blog.csdn.net/a19881029/article/details/8980503
為何使用裝飾器模式
??一個設計模式的出現(xiàn)一定有他特殊的價值。僅僅看見上面的結構圖你可能會想浪册,為何要兜這么一圈來實現(xiàn)扫腺?僅僅是想要多一行輸出,我直接繼承ConcretComponent村象,或者直接在另一個Component的實現(xiàn)類中實現(xiàn)不是一樣嗎笆环?
??首先,裝飾器的價值在于裝飾厚者,他并不影響被裝飾類本身的核心功能咧织。在一個繼承的體系中,子類通常是互斥的籍救。比如一輛車习绢,品牌只能要么是奧迪、要么是寶馬,不可能同時屬于奧迪和寶馬闪萄,而品牌也是一輛車本身的重要屬性特征梧却。但當你想要給汽車噴漆,換坐墊败去,或者更換音響時放航,這些功能是互相可能兼容的,并且他們的存在不會影響車的核心屬性:那就是他是一輛什么車圆裕。這時你就可以定義一個裝飾器:噴了漆的車广鳍。不管他裝飾的車是寶馬還是奧迪,他的噴漆效果都可以實現(xiàn)吓妆。
??再回到這個例子中赊时,我們看到的僅僅是一個ConcreteComponent類。在復雜的大型項目中行拢,同一級下的兄弟類通常有很多祖秒。當你有五個甚至十個ConcreteComponent時,再想要為每個類都加上“ready舟奠?go竭缝!”的效果,就要寫出五個子類了沼瘫。毫無疑問這是不合理的抬纸。裝飾器模式在不影響各個ConcreteComponent核心價值的同時,添加了他特有的裝飾效果耿戚,具備非常好的通用性湿故,這也是他存在的最大價值。