裝飾器模式

定義:裝飾模式是在不必改變原類文件和使用繼承的情況下,動態的擴展一個對象的功能。它是通過創建一個包裝對象,也就是裝飾來包裹真實的對象。

             這一個解釋,引自百度百科,我們注意其中的幾點。

             1,不改變原類文件。

             2,不使用繼承。

             3,動態擴展。

實例:

package uni.pattern.decorator;  
/* 
 * 創建一個對象的抽象也就是接口 
*/  
public interface Basket {  
    public void show();  
      
}

下面是被裝飾的對象,也就是對接口的一個實現,注意可以有多個實現

package uni.pattern.decorator;  
  
/** 
 *身份:被裝飾的對象 
 *一個對接口的實現,這個對象表示要我們將來要修飾的籃子里裝內容,如果想修飾籃子的造型,還可以創建其他類實現Basket的接口,比如Shape 
 * 不理解的話可以查看java語言的接口抽象機制 
*/  
public class Original implements Basket{  
    public void show(){  
      System.out.println("The original Basket contains");  
    }  
}

接下來是三個裝飾器的實現

package uni.pattern.decorator;  
  
/** 
 *身份:裝飾器 
 *為原來的類添加新的功能 
*/  
public class AppleDecorator implements Basket{  
    private Basket basket;  
    public AppleDecorator( Basket basket){  
      super();  
      this.basket = basket;  
    }  
      
    public void show(){  
      basket.show();  
      System.out.println("An Apple");  
    }  
      
}
package uni.pattern.decorator;  
  
/** 
 *身份:裝飾器 
*/  
public class BananaDecorator implements Basket{  
    private Basket basket;  
    public BananaDecorator(Basket basket){  
        super();  
        this.basket = basket;  
    }  
      
    public void show(){  
        basket.show();  
        System.out.println("A Banana");  
    }  
      
}
package uni.pattern.decorator;  
  
/** 
 *身份:裝飾器 
*/  
public class OrangeDecorator implements Basket{  
    private Basket basket;  
    public OrangeDecorator(Basket basket){  
        super();  
        this.basket = basket;  
    }  
      
    public void show(){  
        basket.show();  
        System.out.println("An Oranage");  
    }  
      
}

最后就是實現的效果,我們三個修飾器全部用到,裝滿了籃子,當然也可以只裝一個蘋果或香蕉

/* 
 * 設計模式:裝飾器模式 
 * java 簡單的演示 
*/  
package decoratorpattern;  
import uni.pattern.decorator.Original;  
import uni.pattern.decorator.*;  
  
/** 
 * 
 * @author octobershiner 
 * 2011 7 25 
 * SE.HIT 
*/  
public class DecoratorPattern {  
  
    /** 
     * @param args the command line arguments 
*/  
    public static void main(String[] args) {  
        // TODO code application logic here  
        Basket basket = new Original();  
        //一個裝飾的過程  
        Basket myBasket =new AppleDecorator(new BananaDecorator(new OrangeDecorator(basket)));   
        myBasket.show();  
    }  
}

演示的結果:

run:
The original Basket contains
An Oranage
A Banana
an Apple

成功生成(總時間:0 秒)
裝飾器的優點

1、裝飾者模式可以提供比繼承更多的靈活性
2、可以通過一種動態的方式來擴展一個對象的功能,在運行時選擇不同的裝飾器,從而實現不同的行為。
3、通過使用不同的具體裝飾類以及這些裝飾類的排列組合,可以創造出很多不同行為的組合??梢允褂枚鄠€具體裝飾類來裝飾同一對象,得到功能更為強大的對象。
4、具體構件類與具體裝飾類可以獨立變化,用戶可以根據需要增加新的具體構件類和具體裝飾類,在使用時再對其進行組合,原有代碼無須改變,符合“開閉原則”。

缺點

1、會產生很多的小對象,增加了系統的復雜性
2、這種比繼承更加靈活機動的特性,也同時意味著裝飾模式比繼承更加易于出錯,排錯也很困難,對于多次裝飾的對象,調試時尋找錯誤可能需要逐級排查,較為煩瑣。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 定義 裝飾器模式又名包裝(Wrapper)模式。裝飾器模式以對客戶端透明的方式拓展對象的功能,是繼承關系的一種替代...
    步積閱讀 35,831評論 0 38
  • 概述 裝飾器模式一種動態地往一個類中添加新的行為的設計模式。就功能而言,修飾模式相比生成子類更為靈活,這樣可以給某...
    ymjkMaster閱讀 792評論 0 0
  • 設計模式匯總 一、基礎知識 1. 設計模式概述 定義:設計模式(Design Pattern)是一套被反復使用、多...
    MinoyJet閱讀 3,984評論 1 15
  • 裝飾器模式 裝飾器模式是一種旨在提升代碼復用率的結構性模式。有點類似于混入模式,它被認為是一種可以替代子類的可行方...
    pws019閱讀 361評論 0 0
  • 前言 距離上一篇,間隔時間有點長哈(尷尬 ==!)經歷過漫長的實習期,試用期,第一份工作終于慢慢走上正軌,中間發生...
    暗影飛客閱讀 1,189評論 0 0