- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) > 編程語(yǔ)言 >
- Java通俗易懂系列設計模式之裝飾模式
裝飾模式,是面向對象編程領(lǐng)域中,一種動(dòng)態(tài)地往一個(gè)類(lèi)中添加新的行為的設計模式。就功能而言,裝飾模式相比生成子類(lèi)更為靈活,這樣可以給某個(gè)對象而不是整個(gè)類(lèi)添加一些功能。
意圖:動(dòng)態(tài)地給一個(gè)對象添加一些額外的職責和增加功能。
主要解決:一般的,我們?yōu)榱藬U展一個(gè)類(lèi)經(jīng)常使用繼承方式實(shí)現,由于繼承為類(lèi)引入靜態(tài)特征,并且隨著(zhù)擴展功能的增多,子類(lèi)會(huì )很膨脹。
何時(shí)使用:在不想增加很多子類(lèi)的情況下擴展類(lèi)。
如何解決:將具體功能職責劃分,同時(shí)繼承裝飾者模式。
關(guān)鍵代碼:
1、Component 類(lèi)充當抽象角色,不應該具體實(shí)現。
2、修飾類(lèi)引用和繼承 Component 類(lèi),具體擴展類(lèi)重寫(xiě)父類(lèi)方法。
以結婚婚車(chē)為例,定義汽車(chē)接口
public interface Car { void drive(); }
創(chuàng )建實(shí)現接口的實(shí)體類(lèi),德國寶馬系應該是作為婚車(chē)最多的品牌,
public class BMW implements Car { @Override public void drive() { System.out.println("寶馬汽車(chē),風(fēng)馳電掣。"); } }
創(chuàng )建實(shí)現了 Car 接口的抽象裝飾類(lèi)。我們需要婚車(chē)接新娘
public abstract class WeddingCarDecorator implements Car{ private Car decoratorCar; public WeddingCarDecorator(Car decoratorCar) { this.decoratorCar = decoratorCar; } @Override public void drive() { decoratorCar.drive(); } }
創(chuàng )建擴展了 WeddingCarDecorator 類(lèi)的實(shí)體裝飾類(lèi) - 寶馬婚車(chē)。
public class BMWWeddingCar extends WeddingCarDecorator { public BMWWeddingCar(Car decoratorCar) { super(decoratorCar); } @Override public void drive() { beautify(); super.drive(); } private void beautify() { System.out.println("結婚婚車(chē),鋪上鮮花,系上氣球。"); } }
使用 WeddingCarDecorator 來(lái)裝飾 Car對象。
public class DecoratorDemoMain { public static void main(String[] args) { System.out.println("------正常的德系寶馬------"); BMW bmw = new BMW(); bmw.drive(); System.out.println("------作為婚車(chē)的德系寶馬------"); BMWWeddingCar bmwWeddingCar = new BMWWeddingCar(bmw); bmwWeddingCar.drive(); } }
執行程序,輸出結果:
------正常的德系寶馬------
寶馬汽車(chē),風(fēng)馳電掣。
------作為婚車(chē)的德系寶馬------
結婚婚車(chē),鋪上鮮花,系上氣球。
優(yōu)點(diǎn):
裝飾類(lèi)和被裝飾類(lèi)可以獨立發(fā)展,不會(huì )相互耦合,裝飾模式是繼承的一個(gè)替代模式,裝飾模式可以動(dòng)態(tài)擴展一個(gè)實(shí)現類(lèi)的功能。
缺點(diǎn):
多層裝飾比較復雜,使用了許多類(lèi)似的對象(裝飾器)。
使用場(chǎng)景:
1、擴展一個(gè)類(lèi)的功能。
2、動(dòng)態(tài)增加功能,動(dòng)態(tài)撤銷(xiāo)。裝飾器模式在Java IO類(lèi)中經(jīng)常使用,例如FileReader,BufferedReader等。
注意事項:可代替繼承。
以上就是Java通俗易懂系列設計模式之裝飾模式的詳細內容,更多關(guān)于Java設計模式的資料請關(guān)注腳本之家其它相關(guān)文章!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站