現實生活中常常需要給某類產品動態增加新的功能,如:給麵條各種調味品。在軟體開發過程中,有時想用一些現存的元件。這些元件可能只是完成一些核心功能。但在不改變其架構的情況下,可以動態地擴充套件其功能。所以這些都可以採用裝飾模式來實現。裝飾者模式:動態的將新功能附加到物件上。在物件功能擴充套件方面,它比繼承更有彈性,裝飾者模式也體現了開閉原則。
設計模式屬於結構型模式。
這種模式建立乙個裝飾類,用來包裝原有的類,並在保持類方法簽名完整性的前提下,提供了額外的功能。
優點:裝飾類和被裝飾類可以獨立發展,不會相互耦合,裝飾模式是繼承的乙個替代模式,裝飾模式可以動態擴充套件乙個實現類的功能。
缺點:多層裝飾比較複雜。
定義乙個裝飾者和被裝飾者都需要整合的抽象類(food 食物)
public
abstract
class
food
被裝飾者需要繼承的類(noodles 麵條)
public
class noodles extends
food
7 }被裝飾者具體的實現類之一(chinesenoodles 中式麵條)
public
class chinesenoodles extends
noodles
7 }裝飾者類都需要整合的公共類
public
class decorator extends
food8//
將自己的**與被裝飾者**進行成績
9@override
10public
double
cost()
16 }
裝飾者實現類之一
//孜然類
2public
class cumin extends
decorator
9 }客戶端呼叫:優點,乙個產品可以被多個裝飾者裝飾,同時裝飾者和被裝飾者擴充套件時都非常靈活,只需要擴充套件自己的類即可,無需修改其他類。
public
class
client
15 }
四、裝飾者模式在jdk應用的原始碼分析
jdk 中流的使用用到了裝飾者模式。從下面的客戶端使用能夠得出 fileinputstream 是被裝飾者,datainputstream 是裝飾者類的乙個實現類,下面就進入 fileinputstream 中檢視源**:
public
class
decorator
5 }fileinputstream 繼承了 inputstream ,也就是上面提到的 food 類及 chinesenoodles 之間的關係。
public
class fileinputstream extends
inputstream
進入 datainputstream 裝飾者類的實現類
public
class datainputstream extends filterinputstream implements
datainput
9 }最重要的部分:裝飾者類 filterinputstream 繼承和組合了 inputstream 介面,被裝飾者也實現了此介面。
1//整合最頂層 inputstream 介面,被裝飾者也整合的介面,因為此類的返回值要與被裝飾類型別相同
2public
class filterinputstream extends
inputstream
14 }
原始碼類圖如下:與裝飾者類的類圖一致,易理解。
設計模式 裝飾者模式
public abstract class beverage public abstract double cost public abstract class condimentdecorator extends beverage public class darkroast extends be...
設計模式 裝飾者模式
沒什麼特別的,之前看懂了,這次自己再複述一下。畢竟把別人講懂了才是真的懂了。主要參考了head first 設計模式。例子講述的是在為星巴克咖啡的製作訂單的情況,比如客人點了飲料,那麼系統會自動算出 不知道是我沒有體會到,還是這個例子不太合適,算出 那麼簡單的事還需要用到類?不過不影響我們思考裝飾者...
設計模式 裝飾者模式
好幾天沒出部落格了,在學習android的一些新控制項的時候,用到了乙個模式,叫裝飾者模式,所以在此講講這個模式。模式,包含以下四個角色 1 抽象構件 component 角色 給出乙個抽象介面,以規範準備接收附加責任的物件。2 具體構件 concretecomponent 角色 定義乙個將要接收附...