java設(shè)計(jì)模式之裝飾模式詳細(xì)介紹
1. 裝飾模式(Decorator)的定義:又名包裝(Wrapper)模式,裝飾模式以對(duì)客戶(hù)端透明的方式擴(kuò)展對(duì)象的功能,是繼承關(guān)系的一個(gè)替代方案。
2. 裝飾模式以對(duì)客戶(hù)端透明的方式動(dòng)態(tài)的給一個(gè)對(duì)象附加上更多的責(zé)任。換言之客戶(hù)端并不會(huì)覺(jué)的對(duì)象在裝飾前和裝飾后有什么區(qū)別。
3. 裝飾模式可以在不創(chuàng)造更多的子類(lèi)的模式下,將對(duì)象的功能加以擴(kuò)展。
4. 裝飾模式與類(lèi)繼承的區(qū)別:
1) 裝飾模式是一種動(dòng)態(tài)行為,對(duì)已經(jīng)存在類(lèi)進(jìn)行隨意組合,而類(lèi)的繼承是一種靜態(tài)的行為,一個(gè)類(lèi)定義成什么樣的,該類(lèi)的對(duì)象便具有什么樣的功能,無(wú)法動(dòng)態(tài)的改變。
2) 裝飾模式擴(kuò)展的是對(duì)象的功能,不需要增加類(lèi)的數(shù)量,而類(lèi)繼承擴(kuò)展是類(lèi)的功能,在繼承的關(guān)系中,如果我們想增加一個(gè)對(duì)象的功能,我們只能通過(guò)繼承關(guān)系,在子類(lèi)中增加兩個(gè)方法。
3) 裝飾與繼承比較圖:
4) 裝飾模式是在不改變?cè)?lèi)文件和使用繼承的情況下,動(dòng)態(tài)的擴(kuò)展一個(gè)對(duì)象的功能,它是通過(guò)創(chuàng)建一個(gè)包裝對(duì)象,也就是裝飾來(lái)包裹真是的對(duì)象。
5. 裝飾模式把對(duì)客戶(hù)端的調(diào)用委派給被裝飾的類(lèi),裝飾模式的關(guān)鍵在于這種擴(kuò)展完全透明的。
6. 裝飾模式的構(gòu)成:
1) 抽象構(gòu)建角色(Component):給出一個(gè)抽象的接口,以規(guī)范準(zhǔn)備接受附加責(zé)任的對(duì)象。相當(dāng)于i/o流里面InputStream/OutputStream和Reader/Writer。
2) 具體的構(gòu)建角色(ConcreteComponent):定義一個(gè)將要接受附加責(zé)任的類(lèi)。相當(dāng)于i/o里面的FileOutputStream和FileInputStream。
3) 裝飾角色(Docorator):持有一個(gè)抽象構(gòu)建(Component)角色的引用,并定義一個(gè)與抽象構(gòu)件一致的接口。相當(dāng)于i/o里面的FilerOutputStream和FilterInputStream。
4) 具體的裝飾角色(ConcreteDecorator):負(fù)責(zé)給構(gòu)建對(duì)象“貼上”附加的責(zé)任。相當(dāng)于i/o流里面的BufferedOutputStream和BufferedInputStream以及DataOutputStream和DataInputSrtream。
7. 裝飾模式的特點(diǎn):
1) 裝飾對(duì)象和真實(shí)對(duì)象具有相同的接口,這樣客戶(hù)端對(duì)象就可以以真實(shí)對(duì)象的相同的方式和裝飾對(duì)象交互。
2) 裝飾對(duì)象包含一個(gè)真實(shí)對(duì)象的引用(reference).
3) 裝飾對(duì)象接受所有來(lái)自客戶(hù)端的請(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ān)系來(lái)擴(kuò)展給定類(lèi)的功能。
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) 客戶(hù)端
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)文章
貨拉拉大數(shù)據(jù)對(duì)BitMap的探索實(shí)踐詳解
這篇文章主要為大家介紹了貨拉拉大數(shù)據(jù)對(duì)BitMap的探索實(shí)踐詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09Java Spring Security認(rèn)證與授權(quán)及注銷(xiāo)和權(quán)限控制篇綜合解析
Spring Security 是 Spring 家族中的一個(gè)安全管理框架,實(shí)際上,在 Spring Boot 出現(xiàn)之前,Spring Security 就已經(jīng)發(fā)展了多年了,但是使用的并不多,安全管理這個(gè)領(lǐng)域,一直是 Shiro 的天下2021-10-10劍指Offer之Java算法習(xí)題精講二叉樹(shù)專(zhuān)項(xiàng)訓(xùn)練
跟著思路走,之后從簡(jiǎn)單題入手,反復(fù)去看,做過(guò)之后可能會(huì)忘記,之后再做一次,記不住就反復(fù)做,反復(fù)尋求思路和規(guī)律,慢慢積累就會(huì)發(fā)現(xiàn)質(zhì)的變化2022-03-03詳解spring boot starter redis配置文件
spring-boot-starter-Redis主要是通過(guò)配置RedisConnectionFactory中的相關(guān)參數(shù)去實(shí)現(xiàn)連接redis service。下面通過(guò)本文給大家介紹在spring boot的配置文件中redis的基本配置,需要的的朋友參考下2017-07-07Spring?boot配置綁定和配置屬性校驗(yàn)的方式詳解
這篇文章主要介紹了Spring?boot配置綁定和配置屬性校驗(yàn),SpringBoot 提供了2 種方式進(jìn)行配置綁定,即使用 @ConfigurationProperties 注解和使用 @Value 注解,需要的朋友可以參考下2022-05-05Spring Cloud Feign簡(jiǎn)單使用詳解
本篇文章主要介紹了Spring Cloud Feign簡(jiǎn)單使用詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-02-02Java實(shí)現(xiàn)級(jí)聯(lián)下拉結(jié)構(gòu)的示例代碼
在開(kāi)發(fā)過(guò)程中,會(huì)遇到很多的實(shí)體需要將查出的數(shù)據(jù)處理為下拉或者級(jí)聯(lián)下拉的結(jié)構(gòu),提供給前端進(jìn)行展示。本文為大家介紹了java封裝下拉和級(jí)聯(lián)下拉的通用工具類(lèi),需要的可以參考一下2022-06-06json如何解析混合數(shù)組對(duì)象到實(shí)體類(lèi)的list集合里去
這篇文章主要介紹了json解析混合數(shù)組對(duì)象到實(shí)體類(lèi)的list集合里去的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(62)
下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你2021-08-08