舉例講解Java設(shè)計(jì)模式編程中Decorator裝飾者模式的運(yùn)用
概念
裝飾者模式動(dòng)態(tài)地將責(zé)任附加到對(duì)象上。若要擴(kuò)展功能,裝飾者提供了比繼承更有彈性的替代方案。
裝飾者和被裝飾對(duì)象有相同的超類型。
你可以用一個(gè)或多個(gè)裝飾者包裝一個(gè)對(duì)象。
既然裝飾者和被裝飾對(duì)象有相同的超類型,所以在任何需要原始對(duì)象(被包裝的)的場(chǎng)合 ,可以用裝飾過(guò)的對(duì)象代替它。
裝飾者可以在所委托被裝飾者的行為之前與/或之后,加上自己的行為,以達(dá)到特定的目的。
對(duì)象可以在任何時(shí)候被裝飾,所以可以在運(yùn)行時(shí)動(dòng)態(tài)地、不限量地用你喜歡的裝飾者來(lái)裝飾
對(duì)象。
在Java中,io包下的很多類就是典型的裝飾者模式的體現(xiàn),如:
- new BufferedOutputStream(OutputStream out)
- new BufferedInputStream(InputStream in);
- new PrintWriter(OutputStream out)
- new FilterReader(Reader in);
裝飾類與被裝飾的類 實(shí)現(xiàn)相同的接口,
被裝飾類,不關(guān)心具體是哪個(gè)實(shí)現(xiàn)類來(lái)裝飾它,
同樣的業(yè)務(wù)方法,被裝飾類調(diào)用裝飾類的方法,增強(qiáng)裝飾類的功能
實(shí)例:
類圖
public interface IReader { void read(); } public class Reader implements IReader { @Override public void read() { System.out.println("read of Reader"); } } public class BufferedReader implements IReader { private IReader mReader; public BufferedReader(IReader reader) { this.mReader = reader; } @Override public void read() { System.out.println("read of BufferedReader"); mReader.read(); } } public class Test { public static void main(String[] args) { Reader reader = new Reader(); reader.read(); System.out.println("----------"); BufferedReader bufferedReader = new BufferedReader(reader); bufferedReader.read(); } }
特點(diǎn):
1.裝飾對(duì)象和真實(shí)對(duì)象有相同的接口。這樣客戶端對(duì)象就能以和真實(shí)對(duì)象相同的方式和裝飾對(duì)象交互。
2.裝飾對(duì)象包含一個(gè)真實(shí)對(duì)象的引用(reference)
3.裝飾對(duì)象接受所有來(lái)自客戶端的請(qǐng)求。它把這些請(qǐng)求轉(zhuǎn)發(fā)給真實(shí)的對(duì)象。
4.裝飾對(duì)象可以在轉(zhuǎn)發(fā)這些請(qǐng)求以前或以后增加一些附加功能。這樣就確保了在運(yùn)行時(shí),不用修改給定對(duì)象的結(jié)構(gòu)就可以在外部增加附加的功能。
在面向?qū)ο蟮脑O(shè)計(jì)中,通常是通過(guò)繼承來(lái)實(shí)現(xiàn)對(duì)給定類的功能擴(kuò)展。而裝飾后,持有了真實(shí)對(duì)象,用以增強(qiáng)其功能。
裝飾者與適配器模式的區(qū)別:
關(guān)于新職責(zé):適配器也可以在轉(zhuǎn)換時(shí)增加新的職責(zé),但主要目的不在此。裝飾者模式主要是給被裝飾者增加新職責(zé)的。
關(guān)于其包裹的對(duì)象:適配器是知道被適配者的詳細(xì)情況的(就是適配類)。裝飾者只知道其接口是什么,
至于其具體類型(是基類還是其他派生類)只有在運(yùn)行期間才知道。
相關(guān)文章
groovy腳本定義結(jié)構(gòu)表一鍵生成POJO類
這篇文章主要為大家介紹了groovy腳本定義結(jié)構(gòu)表一鍵生成POJO類示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03RedisTemplate中opsForValue和opsForList方法的使用詳解
這篇文章主要介紹了RedisTemplate中opsForValue和opsForList方法的使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08Java中比較運(yùn)算符compareTo()、equals()與==的區(qū)別及應(yīng)用總結(jié)
這篇文章主要給大家介紹了關(guān)于Java中比較運(yùn)算符compareTo()、equals()與==的區(qū)別及應(yīng)用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-09-09SpringBoot2.3.0配置JPA的實(shí)現(xiàn)示例
這篇文章主要介紹了SpringBoot2.3.0配置JPA的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08java JDBC系列教程之JDBC類的簡(jiǎn)析與JDBC的基礎(chǔ)操作
這篇文章主要介紹了java JDBC系列教程之JDBC類的簡(jiǎn)析與JDBC的基礎(chǔ)操作,本文分步驟通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07Java實(shí)現(xiàn)文件批量重命名具體實(shí)例
這篇文章主要介紹了Java實(shí)現(xiàn)文件批量重命名具體實(shí)例,需要的朋友可以參考下2014-02-02