java設(shè)計模式之裝飾模式詳細介紹
1. 裝飾模式(Decorator)的定義:又名包裝(Wrapper)模式,裝飾模式以對客戶端透明的方式擴展對象的功能,是繼承關(guān)系的一個替代方案。
2. 裝飾模式以對客戶端透明的方式動態(tài)的給一個對象附加上更多的責任。換言之客戶端并不會覺的對象在裝飾前和裝飾后有什么區(qū)別。
3. 裝飾模式可以在不創(chuàng)造更多的子類的模式下,將對象的功能加以擴展。
4. 裝飾模式與類繼承的區(qū)別:
1) 裝飾模式是一種動態(tài)行為,對已經(jīng)存在類進行隨意組合,而類的繼承是一種靜態(tài)的行為,一個類定義成什么樣的,該類的對象便具有什么樣的功能,無法動態(tài)的改變。
2) 裝飾模式擴展的是對象的功能,不需要增加類的數(shù)量,而類繼承擴展是類的功能,在繼承的關(guān)系中,如果我們想增加一個對象的功能,我們只能通過繼承關(guān)系,在子類中增加兩個方法。
3) 裝飾與繼承比較圖:
4) 裝飾模式是在不改變原類文件和使用繼承的情況下,動態(tài)的擴展一個對象的功能,它是通過創(chuàng)建一個包裝對象,也就是裝飾來包裹真是的對象。
5. 裝飾模式把對客戶端的調(diào)用委派給被裝飾的類,裝飾模式的關(guān)鍵在于這種擴展完全透明的。
6. 裝飾模式的構(gòu)成:
1) 抽象構(gòu)建角色(Component):給出一個抽象的接口,以規(guī)范準備接受附加責任的對象。相當于i/o流里面InputStream/OutputStream和Reader/Writer。
2) 具體的構(gòu)建角色(ConcreteComponent):定義一個將要接受附加責任的類。相當于i/o里面的FileOutputStream和FileInputStream。
3) 裝飾角色(Docorator):持有一個抽象構(gòu)建(Component)角色的引用,并定義一個與抽象構(gòu)件一致的接口。相當于i/o里面的FilerOutputStream和FilterInputStream。
4) 具體的裝飾角色(ConcreteDecorator):負責給構(gòu)建對象“貼上”附加的責任。相當于i/o流里面的BufferedOutputStream和BufferedInputStream以及DataOutputStream和DataInputSrtream。
7. 裝飾模式的特點:
1) 裝飾對象和真實對象具有相同的接口,這樣客戶端對象就可以以真實對象的相同的方式和裝飾對象交互。
2) 裝飾對象包含一個真實對象的引用(reference).
3) 裝飾對象接受所有來自客戶端的請求,它把這些請求轉(zhuǎn)發(fā)給真實的對象。
4) 裝飾對象可以在轉(zhuǎn)發(fā)這些請求以前或者以后增加一些附加的功能。這樣就能確保在運行時,不用修改給定對象結(jié)構(gòu)就可以在外部增加附加的功能。在面向?qū)ο蟮某绦蛟O(shè)計中,通常是使用繼承的關(guān)系來擴展給定類的功能。
8. 案例:
1) 抽象的構(gòu)建接口:
packagecom.abao.decorate;
public interface Component
{
public void doSomething();
}
2) 具體的構(gòu)建角色:
packagecom.abao.decorate;
public class ConcreteComponent implements Component
{
@Override
public void doSomething()
{
System.out.println("功能A");
}
}
3) 裝飾角色:
packagecom.abao.decorate;
public class Decorate implements Component
{
private Component component;
public Decorate(Component component)
{
this.component = component;
}
@Override
public void doSomething()
{
component.doSomething();
}
}
4) 具體裝飾角色1:
packagecom.abao.decorate;
public class ConcreteDecorate1 extends Decorate
{
public ConcreteDecorate1(Component component)
{
super(component);
}
@Override
public void doSomething()
{
super.doSomething();
this.doAnotherDosomething();
}
private void doAnotherDosomething()
{
System.out.println("功能B");
}
}
5) 具體裝飾角色2:
packagecom.abao.decorate;
public class ConcreteDecorate2 extends Decorate
{
public ConcreteDecorate2(Component component)
{
super(component);
}
@Override
public void doSomething()
{
super.doSomething();
this.doAnotherDosomething();
}
private void doAnotherDosomething()
{
System.out.println("功能C");
}
}
6) 客戶端
packagecom.abao.decorate;
public class Client
{
public static void main(String[] args)
{
Component component = new ConcreteDecorate1(
new ConcreteDecorate2(new ConcreteComponent()));
component.doSomething();
}
}
9. 完!
相關(guān)文章
SpringBoot整合MongoDB實現(xiàn)事務(wù)管理
Spring Boot是一種快速開發(fā)Spring應(yīng)用的方式,它提供了大量的自動配置和默認設(shè)置,以簡化開發(fā)流程,MongoDB是一個基于文檔的NoSQL數(shù)據(jù)庫,本文將介紹如何在Spring Boot應(yīng)用中整合MongoDB,并實現(xiàn)事務(wù)管理,需要的朋友可以參考下2024-07-07
Spring實戰(zhàn)之ResourceLoaderAware加載資源用法示例
這篇文章主要介紹了Spring實戰(zhàn)之ResourceLoaderAware加載資源用法,結(jié)合實例形式分析了spring使用ResourceLoaderAware加載資源相關(guān)配置與操作技巧,需要的朋友可以參考下2020-01-01
詳解Spring Cloud Feign 熔斷配置的一些小坑
這篇文章主要介紹了詳解Spring Cloud Feign 熔斷配置的一些小坑,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-04-04
解析springboot集成AOP實現(xiàn)日志輸出的方法
如果這需要在每一個controller層去寫的話代碼過于重復,于是就使用AOP定義切面 對其接口調(diào)用前后進行攔截日志輸出。接下來通過本文給大家介紹springboot集成AOP實現(xiàn)日志輸出,需要的朋友可以參考下2021-11-11
SpringBoot優(yōu)化接口響應(yīng)時間的九個技巧
在實際開發(fā)中,提升接口響應(yīng)速度是一件挺重要的事,特別是在面臨大量用戶請求的時候,本文為大家整理了9個SpringBoot優(yōu)化接口響應(yīng)時間的技巧,希望對大家有所幫助2024-01-01

