4.2 Java IO 包中的Decorator模式
JDK為程序員提供了大量的類庫(kù),而為了保持類庫(kù)的可重用性,可擴(kuò)展性和靈活性,其中使用到了大量的設(shè)計(jì)模式,本文將介紹JDK的I/O包中使用到的Decorator模式,并運(yùn)用此模式,實(shí)現(xiàn)一個(gè)新的輸出流類。
Decorator模式簡(jiǎn)介
Decorator模式又名包裝器(Wrapper),它的主要用途在于給一個(gè)對(duì)象動(dòng)態(tài)的添加一些額外的職責(zé)。與生成子類相比,它更具有靈活性。
有時(shí)候,我們需要為一個(gè)對(duì)象而不是整個(gè)類添加一些新的功能,比如,給一個(gè)文本區(qū)添加一個(gè)滾動(dòng)條的功能。我們可以使用繼承機(jī)制來(lái)實(shí)現(xiàn)這一功能,但是這種方法不夠靈活,我們無(wú)法控制文本區(qū)加滾動(dòng)條的方式和時(shí)機(jī)。而且當(dāng)文本區(qū)需要添加更多的功能時(shí),比如邊框等,需要?jiǎng)?chuàng)建新的類,而當(dāng)需要組合使用這些功能時(shí)無(wú)疑將會(huì)引起類的爆炸。
我們可以使用一種更為靈活的方法,就是把文本區(qū)嵌入到滾動(dòng)條中。而這個(gè)滾動(dòng)條的類就相當(dāng)于對(duì)文本區(qū)的一個(gè)裝飾。這個(gè)裝飾(滾動(dòng)條)必須與被裝飾的組件(文本區(qū))繼承自同一個(gè)接口,這樣,用戶就不必關(guān)心裝飾的實(shí)現(xiàn),因?yàn)檫@對(duì)他們來(lái)說(shuō)是透明的。裝飾會(huì)將用戶的請(qǐng)求轉(zhuǎn)發(fā)給相應(yīng)的組件(即調(diào)用相關(guān)的方法),并可能在轉(zhuǎn)發(fā)的前后做一些額外的動(dòng)作(如添加滾動(dòng)條)。通過(guò)這種方法,我們可以根據(jù)組合對(duì)文本區(qū)嵌套不同的裝飾,從而添加任意多的功能。這種動(dòng)態(tài)的對(duì)對(duì)象添加功能的方法不會(huì)引起類的爆炸,也具有了更多的靈活性。
以上的方法就是Decorator模式,它通過(guò)給對(duì)象添加裝飾來(lái)動(dòng)態(tài)的添加新的功能。如下是Decorator模式的UML圖:
Component為組件和裝飾的公共父類,它定義了子類必須實(shí)現(xiàn)的方法。
ConcreteComponent是一個(gè)具體的組件類,可以通過(guò)給它添加裝飾來(lái)增加新的功能。
Decorator是所有裝飾的公共父類,它定義了所有裝飾必須實(shí)現(xiàn)的方法,同時(shí),它還保存了一個(gè)對(duì)于Component的引用,以便將用戶的請(qǐng)求轉(zhuǎn)發(fā)給Component,并可能在轉(zhuǎn)發(fā)請(qǐng)求前后執(zhí)行一些附加的動(dòng)作。
ConcreteDecoratorA和ConcreteDecoratorB是具體的裝飾,可以使用它們來(lái)裝飾具體的Component。
相關(guān)推薦:計(jì)算機(jī)等級(jí)考試二級(jí)Java經(jīng)典算法大全匯總
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |