剛看了一篇博客,講裝飾器模式的,我覺得寫得很清楚,我自己就沒寫了,只是把代碼整理了一下,順便說一下,所有設計模式的代碼我都進行了整理,後面我會放到csdn上,這些代碼大多數來時internet,但是我會把代碼進行簡化,讓它能夠突出設計模式的概念。下面是轉帖的內容。
記得以前聽一個高手說java.io包採用了了裝飾器模式,當時不是很明白什麼事裝飾器模式,現在,網上看了一下說明和幫助的例子,他們的例子是這樣的。
定義:
Decorator裝飾器,顧名思義,就是動態地給一個對象添加一些額外的職責,就好比爲房子進行裝修一樣。
因此,裝飾器模式具有如下的特徵:
它必須具有一個裝飾的對象。
它必須擁有與被裝飾對象相同的接口。
它可以給被裝飾對象添加額外的功能。
用一句話總結就是:保持接口,增強性能。
裝飾器通過包裝一個裝飾對象來擴展其功能,而又不改變其接口,這實際上是基於對象的適配器模式的一種變種。它與對象的適配器模式的異同點如下。
相同點:都擁有一個目標對象。
不同點:適配器模式需要實現另外一個接口,而裝飾器模式必須實現該對象的接口。
Sourcable類的源代碼如下所示,其定義了一個接口函數 operation() 。
- interface Sourcable {
- public void operation();
- }
Source.java 是 Sourcable.java 的一個實現,其函數 operation() 負責往控制檯輸出一個字符串:原始類的方法。其源代碼如下所示:
- class Source implements Sourcable {
- public void operation() {
- System.out.println("原始類的方法");
- }
- }
裝飾器類 Decorator1.java 採用了典型的對象適配器模式,它首先擁有一個 Sourcable 對象 source ,該對象通過構造函 數進行初始化。然後它實現了 Sourcable.java 接口,以期保持與 source 同樣的接口,並在重寫的 operation() 函數中調用 source 的 operation() 函數,在調用前後可以實現自己的輸出,這就是裝飾器所擴展的功能。其源代碼如下所示:
- class Decorator1 implements Sourcable {
- private Sourcable sourcable;
- public Decorator1(Sourcable sourcable){
- super();
- this.sourcable=sourcable;
- }
- public void operation() {
- System.out.println("第一個裝飾器前");
- sourcable.operation();
- System.out.println("第一個裝飾器後");
- }
- }
裝飾器類Decorator2.java 是另一個裝飾器,不同的是它裝飾的內容不一樣,即輸出了不同的字符串。其源代碼如下 所示:
- class Decorator2 implements Sourcable {
- private Sourcable sourcable;
- public Decorator2(Sourcable sourcable){
- super();
- this.sourcable=sourcable;
- }
- public void operation() {
- System.out.println("第二個裝飾器前");
- sourcable.operation();
- System.out.println("第二個裝飾器後");
- }
- }
裝飾器類Decorator3.java 是第三個裝飾器,不同的是它裝飾的內容不一樣,即輸出了不同的字符串。其源代碼如下所示:
- class Decorator3 implements Sourcable {
- private Sourcable sourcable;
- public Decorator3(Sourcable sourcable){
- super();
- this.sourcable=sourcable;
- }
- public void operation() {
- System.out.println("第三個裝飾器前");
- sourcable.operation();
- System.out.println("第三個裝飾器後");
- }
- }
這時,我們就可以像使用對象的適配器模式一樣來使用這些裝飾器,使用不同的裝飾器就可以達到不同的裝飾效果。如下所示,首先需要創建一個源類對象 source ,然後根據將對象使用 Decorator1 來裝飾,並以此使用 Decorator2 、 Decorator3 進行裝飾,裝飾後的對象同樣具有與source同樣的接口。
- public class Test {
- /**
- * @param args
- */
- public static void main(String[] args) {
- Sourcable source = new Source();
- // 裝飾類對象
- Sourcable obj = new Decorator1(new Decorator2(new Decorator3(source)));
- obj.operation();
- }
- }
運行該程序的輸出如下:
第一個裝飾器前
第二個裝飾器前
第三個裝飾器前
原始類的方法
第三個裝飾器後
第二個裝飾器後
第一個裝飾器後
從輸出的結果可以看出,原始類對象source 依次被 Decorator1 、 Decorator2 、 Decorator3 進行了裝飾。