JAVA設計模式-Decorator

  剛看了一篇博客,講裝飾器模式的,我覺得寫得很清楚,我自己就沒寫了,只是把代碼整理了一下,順便說一下,所有設計模式的代碼我都進行了整理,後面我會放到csdn上,這些代碼大多數來時internet,但是我會把代碼進行簡化,讓它能夠突出設計模式的概念。下面是轉帖的內容。

 

    記得以前聽一個高手說java.io包採用了了裝飾器模式,當時不是很明白什麼事裝飾器模式,現在,網上看了一下說明和幫助的例子,他們的例子是這樣的。

 

    定義:

    Decorator裝飾器,顧名思義,就是動態地給一個對象添加一些額外的職責,就好比爲房子進行裝修一樣。

   

    因此,裝飾器模式具有如下的特徵:

    它必須具有一個裝飾的對象。

    它必須擁有與被裝飾對象相同的接口。

    它可以給被裝飾對象添加額外的功能。

 

    用一句話總結就是:保持接口,增強性能。

 

    裝飾器通過包裝一個裝飾對象來擴展其功能,而又不改變其接口,這實際上是基於對象的適配器模式的一種變種。它與對象的適配器模式的異同點如下。

    相同點:都擁有一個目標對象。

    不同點:適配器模式需要實現另外一個接口,而裝飾器模式必須實現該對象的接口。

 

    Sourcable類的源代碼如下所示,其定義了一個接口函數 operation() 。

 

   

  1. interface Sourcable {    
  2.     public void operation();  
  3. }   

    

 

    Source.java 是 Sourcable.java 的一個實現,其函數 operation() 負責往控制檯輸出一個字符串:原始類的方法。其源代碼如下所示:

 

   

  1. class Source implements Sourcable {    
  2.     public void operation() {    
  3.         System.out.println("原始類的方法");    
  4.     }    
  5. }   

 

    裝飾器類 Decorator1.java 採用了典型的對象適配器模式,它首先擁有一個 Sourcable 對象 source ,該對象通過構造函 數進行初始化。然後它實現了 Sourcable.java 接口,以期保持與 source 同樣的接口,並在重寫的 operation() 函數中調用  source 的 operation() 函數,在調用前後可以實現自己的輸出,這就是裝飾器所擴展的功能。其源代碼如下所示:

 

   

  1. class Decorator1 implements Sourcable {    
  2.     private Sourcable sourcable;    
  3.     public Decorator1(Sourcable sourcable){    
  4.         super();    
  5.         this.sourcable=sourcable;    
  6.     }    
  7.     public void operation() {    
  8.         System.out.println("第一個裝飾器前");    
  9.         sourcable.operation();    
  10.         System.out.println("第一個裝飾器後");    
  11.     }  
  12. }   

 

    裝飾器類Decorator2.java 是另一個裝飾器,不同的是它裝飾的內容不一樣,即輸出了不同的字符串。其源代碼如下 所示:

 

   

  1. class Decorator2 implements Sourcable {    
  2.     private Sourcable sourcable;    
  3.     public Decorator2(Sourcable sourcable){    
  4.         super();    
  5.         this.sourcable=sourcable;    
  6.     }    
  7.     public void operation() {    
  8.         System.out.println("第二個裝飾器前");    
  9.         sourcable.operation();    
  10.         System.out.println("第二個裝飾器後");    
  11.     }    
  12. }  

 

    裝飾器類Decorator3.java 是第三個裝飾器,不同的是它裝飾的內容不一樣,即輸出了不同的字符串。其源代碼如下所示:

 

   

  1. class Decorator3 implements Sourcable {    
  2.     private Sourcable sourcable;    
  3.     public Decorator3(Sourcable sourcable){    
  4.         super();    
  5.         this.sourcable=sourcable;    
  6.     }    
  7.     public void operation() {    
  8.         System.out.println("第三個裝飾器前");    
  9.         sourcable.operation();    
  10.         System.out.println("第三個裝飾器後");    
  11.     }    
  12. }   

  

    這時,我們就可以像使用對象的適配器模式一樣來使用這些裝飾器,使用不同的裝飾器就可以達到不同的裝飾效果。如下所示,首先需要創建一個源類對象 source ,然後根據將對象使用 Decorator1 來裝飾,並以此使用 Decorator2 、 Decorator3 進行裝飾,裝飾後的對象同樣具有與source同樣的接口。

 

   

  1. public class Test {  
  2.     /** 
  3.      * @param args 
  4.      */  
  5.     public static void main(String[] args) {  
  6.         Sourcable source = new Source();  
  7.         // 裝飾類對象    
  8.         Sourcable obj = new Decorator1(new Decorator2(new Decorator3(source)));  
  9.         obj.operation();  
  10.     }  
  11. }  

 

    運行該程序的輸出如下:

 

    第一個裝飾器前
    第二個裝飾器前
    第三個裝飾器前
    原始類的方法
    第三個裝飾器後
    第二個裝飾器後
    第一個裝飾器後

 

    從輸出的結果可以看出,原始類對象source 依次被 Decorator1 、 Decorator2 、 Decorator3 進行了裝飾。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章