Java設(shè)計(jì)模式之裝飾模式詳解
1.什么是裝飾模式
當(dāng)我們想要改進(jìn)或增強(qiáng)某個(gè)對(duì)象的功能,而又不想繼承該類(lèi)創(chuàng)建子類(lèi),可以考慮使用裝飾模式。
使用裝飾模式增強(qiáng)對(duì)象的某個(gè)功能,比生成子類(lèi)再增強(qiáng),更為靈活。
2.如何實(shí)現(xiàn)
1)抽象組件:定義一個(gè)抽象類(lèi),該抽象類(lèi)定義了“被裝飾者”需要被“裝飾的方法”
2)具體組件:抽象組件的一個(gè)子類(lèi)。成為“被裝飾類(lèi)”
3)裝飾組件:也是抽象組件的一個(gè)子類(lèi)。該類(lèi)中持有“被裝飾者”的引用,用來(lái)調(diào)用被裝飾者的方法??梢詾槌橄箢?lèi),也可以是非抽象類(lèi)。
4)具體裝飾類(lèi):是裝飾組件的一個(gè)子類(lèi),被稱(chēng)為“裝飾者”
3.代碼實(shí)現(xiàn)
1)抽象組件
/** * 抽象組件,定義了被裝飾類(lèi)需要裝飾的方法 */ public abstract class ICake { /** * 需要裝飾的方法 * @return */ public abstract int getPrice(); }
2)被裝飾者
/** * 被裝飾者,是抽象組件的一個(gè)子類(lèi),定義需要被裝飾的方法 */ public class Cake extends ICake { /** * 被裝飾類(lèi)中,裝飾方法的基本實(shí)現(xiàn) * @return */ @Override public int getPrice() { System.out.println("getPrice"); return 100; } }
3)裝飾類(lèi)
/** * 裝飾類(lèi),也是抽象組件的一個(gè)子類(lèi)。 * 可以是抽象類(lèi),也可以是非抽象類(lèi)。 */ public abstract class CakeDecorator extends ICake { /** * 被裝飾類(lèi)的引用,需要在裝飾類(lèi)中,調(diào)用到被裝飾類(lèi)的方法。 */ ICake cake; public CakeDecorator(ICake cake){ this.cake = cake; } }
4)具體裝飾
/** * 具體裝飾類(lèi) */ public class BlueBerryCake extends CakeDecorator { public BlueBerryCake(ICake cake) { super(cake); } /** * 被裝飾的方法 * 在調(diào)用到被裝飾類(lèi)的基礎(chǔ)方法后,還要調(diào)用裝飾類(lèi)要增強(qiáng)的方法 * @return */ @Override public float getPrice(){ return cake.getPrice()+elsePrice(); } /** * 增強(qiáng)的方法 * @return */ private float elsePrice(){ System.out.println("else getPrice"); return 50; } }
5)測(cè)試類(lèi)
public class TestDecorator { public static void main(String args[]){ ICake cake = new Cake(); CakeDecorator decorater = new BlueBerryCake(cake); float price = decorater.getPrice(); System.out.println(price); } }
4.拓展
1)利用子類(lèi)繼承也能實(shí)現(xiàn)某個(gè)方法的增強(qiáng)。相比通過(guò)裝飾模式實(shí)現(xiàn),裝飾模式有和優(yōu)勢(shì)?
被裝飾者和裝飾者是松耦合關(guān)系。裝飾類(lèi)僅僅依賴(lài)于抽象組件,裝飾類(lèi)只需要知道被裝飾類(lèi)是抽象組件的一個(gè)子類(lèi),而不必知道具體是哪個(gè)子類(lèi)。
裝飾模式滿足“開(kāi)-閉原則”,不必修改具體組件,就可以增加針對(duì)該組件的裝飾類(lèi)。
5.JavaIo與裝飾模式
java.IO包中的很多類(lèi)使用了裝飾模式。
Reader
FileReader
BufferdReader
到此這篇關(guān)于Java設(shè)計(jì)模式之裝飾模式詳解的文章就介紹到這了,更多相關(guān)Java裝飾模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java的JSON轉(zhuǎn)換類(lèi)庫(kù)GSON的基礎(chǔ)使用教程
GSON是谷歌開(kāi)源的一款Java對(duì)象與JSON對(duì)象互相轉(zhuǎn)換的類(lèi)庫(kù),Java的JSON轉(zhuǎn)換類(lèi)庫(kù)GSON的基礎(chǔ)使用教程,需要的朋友可以參考下2016-06-06java實(shí)體類(lèi)轉(zhuǎn)json時(shí)null值不要轉(zhuǎn)為"null"問(wèn)題
這篇文章主要介紹了java實(shí)體類(lèi)轉(zhuǎn)json時(shí)null值不要轉(zhuǎn)為“null”問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11SpringCloud?LoadBalancerClient?負(fù)載均衡原理解析
LoadBalancerClient?是?SpringCloud?提供的一種負(fù)載均衡客戶端,Ribbon?負(fù)載均衡組件內(nèi)部也是集成了?LoadBalancerClient?來(lái)實(shí)現(xiàn)負(fù)載均衡,本文給大家深入解析?LoadBalancerClient?接口源碼,感興趣的朋友跟隨小編一起看看吧2022-02-02Java SpringBoot啟動(dòng)指定profile的8種方式詳解
這篇文章主要介紹了spring boot 如何指定profile啟動(dòng)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09Java之InputStreamReader類(lèi)的實(shí)現(xiàn)
這篇文章主要介紹了Java之InputStreamReader類(lèi)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11