使用情景:類的功能擴(kuò)展
設(shè)計(jì)原則:類營(yíng)改對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉
體現(xiàn)案例一:
觀察者模式,通過添加新的觀察者,通知觀察者來擴(kuò)展功能
簡(jiǎn)單說明:
裝飾者模式動(dòng)態(tài)的將責(zé)任添加到對(duì)象上,若要擴(kuò)展功能耀找,裝飾者提供了比繼承更有彈性替代方案。
裝飾者模式簡(jiǎn)單類圖
總共分為四部分:
1.被修飾類基本模型(接口或者抽象類)
2.被修飾類子類(具體組件)
》顾隆3.修飾類基本模型(抽象類)
4.修飾類子類(具體修飾類)
簡(jiǎn)單說明:
1.裝飾者與被裝飾者必須實(shí)現(xiàn)相同的接口以保持類型一致叫挟,我們利用繼承來達(dá)到"類型匹配",而不是獲取行為(擴(kuò)展功能)
2.使用對(duì)象組合艰匙,讓被修飾類(飲料)與修飾類(調(diào)料)彈性地加以混合與匹配(擴(kuò)展功能)--依賴?yán)^承,那么類的行為只能在編譯時(shí)決定抹恳,使用組合保證了在運(yùn)行時(shí)決定员凝。
3.被修飾類基本模型可以是接口或者抽象類,靈活變通
具體實(shí)現(xiàn):
Beverage.java(被修飾抽象類)
CondimentDecorator.java修飾抽象類(調(diào)料)
被修飾類具體實(shí)現(xiàn)(飲料)
修飾類具體實(shí)現(xiàn)(調(diào)料)
運(yùn)行時(shí)完成功能擴(kuò)展
具體案例:java/IO ->功能過程只需添加抽象裝飾類FileInputStream子類奋献,組合使用即可
IO結(jié)構(gòu)圖
裝飾者模式優(yōu)缺點(diǎn):
〗∨1.彈性注入旺上,方便功能擴(kuò)展
2.設(shè)計(jì)時(shí)加入大量小類糖埋,不利了解設(shè)計(jì)方式
⌒ā3.類型問題,代碼依賴特殊類型瞳别,導(dǎo)入可能出錯(cuò)
≌骱颉4.實(shí)例化組件時(shí),增加代碼復(fù)雜度祟敛,往往要結(jié)合工廠模式和生成器模式使用