定義:裝飾模式是在不必改變原類文件和使用繼承的情況下,動態的擴展一個對象的功能。它是通過創建一個包裝對象,也就是裝飾來包裹真實的對象。
這一個解釋,引自百度百科,我們注意其中的幾點。
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、這種比繼承更加靈活機動的特性,也同時意味著裝飾模式比繼承更加易于出錯,排錯也很困難,對于多次裝飾的對象,調試時尋找錯誤可能需要逐級排查,較為煩瑣。