結(jié)構(gòu)型模式:把類或?qū)ο蠼Y(jié)合在一起形成一個更大的結(jié)構(gòu),即類和對象的組合。
概念
所謂裝飾器模式,就是動態(tài)地給一個對象添加一些額外的職責(zé)。就增加功能來說,裝飾模式相比生成子類更為靈活。
使用場景:
- 當(dāng)我們需要在不影響其他類的狀況下,以動態(tài)、透明的方式為類添加功能;
- 當(dāng)不適合使用繼承,又想進(jìn)行方法擴(kuò)展的時候;
結(jié)構(gòu)

1.Component抽象構(gòu)件:
Component是一個接口或者一個抽象類,就是定義我們最核心的對象,也就是最原始的對象,最高層次的抽象,統(tǒng)一整個裝飾器系統(tǒng),用于裝飾器之間溝通的橋梁,就像II/O流中的InputStream,OutputStream一樣2.ConcreteComponent具體構(gòu)件
ConcreteComponent是最核心,最原始,最基本的接口或者抽象類的實現(xiàn),你要裝飾的就是它,裝飾的源頭,你裝飾的最底層,就像I/O流一樣,這就直接跟底層打交道的節(jié)點流,就比如FileInputStream3.Decorator 裝飾角色
一般是一個抽象類,實現(xiàn)接口或者抽象方法,它并不一定有抽象方法,但在它的屬性里必須有一個private變量指向Component抽象構(gòu)件,一般是用構(gòu)造器初始化。就像I/O流中的FilterInputStream4.ConcreteDecoratorA,ConcreteDecoratorB具體的裝飾器角色,這就是要將我們之間建的最核心,最原始,最基礎(chǔ)的東西裝飾成東西或者其他的東西,就像I/O中的BufferedInputStream,DataInputStream等。
使用實例——Java I/O
由于java I/O庫需要很多性能的各種組合,如果這些性能都是用繼承來實現(xiàn),那么每一種組合都需要一個類,這樣就會造成大量行重復(fù)的類出現(xiàn)。如果采用裝飾模式,那么類的數(shù)目就會大大減少,性能的重復(fù)也可以減至最少。因此裝飾模式是java I/O庫基本模式。裝飾模式的引進(jìn),造成靈活性和復(fù)雜性的提高。因此在使用 java I/O 庫時,必須理解java I/O庫是由一些基本的原始流處理器和圍繞它們的裝飾流處理器所組成的。

InputStream類是以抽象組件的形式存在,而FileInputStream就是具體組件,它實現(xiàn)了抽象接口的所有方法,并且持有InputStream對象的引用。FilterInputStream就是一個裝飾類,而BufferInputStream是這個裝飾類的具體實現(xiàn)者,它給InputStream加入了新的功能,使得InputStream讀取的數(shù)據(jù)保存在內(nèi)存中,從而提高讀取性能。
更詳細(xì)的類圖關(guān)系如下,左半部分是InputStream的裝飾體系,右半部分是Reader的裝飾體系,并且他們之間的橋梁是InputStreamReader,他們每一個裝飾體系都與上面標(biāo)準(zhǔn)的裝飾器模式類圖很相似。

總之,裝飾器模式就是一個可以非常靈活的動態(tài)擴(kuò)展類功能的設(shè)計模式,它采用組合的方式取代繼承,使得各個功能的擴(kuò)展更加獨立和靈活。
舉一個工作中的實例,在別的模塊有一個數(shù)據(jù)處理的接口類,我們需要對其進(jìn)行功能擴(kuò)展(擴(kuò)展一些排序,去重的的功能),但是又不想直接繼承其實現(xiàn)類,因為我們只需要用到其中的一些方法和屬性,同時我們自己也有大量的方法和屬性,如果繼承會造成冗余。這時我們就可以使用裝飾器模式,新建一個抽象類,實現(xiàn)數(shù)據(jù)處理接口,同時有一個private變量指向數(shù)據(jù)處理的接口類變量,然后我們就可以根據(jù)我們自己的需求對齊進(jìn)行功能擴(kuò)展,而不用改變/繼承原有的類。