這裏似乎可以解釋之前的一個疑惑:
裝飾器模式與對象的適配器模式的異同: 相同點:都擁有一個目標對象 不同點:適配器模式需要實現另外一個接口,而裝飾器模式必須實現該對象的接口 換句話說,適配器模式就是把一個對象是配成另一個對象,而裝飾器模式將豐富目標對象的功能但不改變它的接口 |
Decorator裝飾器,動態的給一個對象添加一些額外的職責 具有如下特徵: 它必須具有一個裝飾對象 它必須擁有與裝飾對象相同的接口 它可以被裝飾對象添加額外的功能 |
源接口: public interface Sourcable { public void operation(); } |
源類: public class Source implements Sourcable{ @Override public void operation() { // TODO Auto-generated method stub System.out.println("原始類的方法"); } } |
裝飾器類: public class Decorator1 implements Sourcable{ private Sourcable source; public Decorator1(Sourcable source) { super(); this.source = source; } @Override public void operation() { // TODO Auto-generated method stub System.out.println("第1個裝飾器裝飾前"); source.operation(); System.out.println("第1個裝飾器裝飾後"); } } |
裝飾器類: public class Decorator2 implements Sourcable{ private Sourcable source; public Decorator2(Sourcable source) { super(); this.source = source; } @Override public void operation() { // TODO Auto-generated method stub System.out.println("第2個裝飾器裝飾前"); source.operation(); System.out.println("第2個裝飾器裝飾後"); } } |
裝飾器類: public class Decorator3 implements Sourcable{ private Sourcable source; public Decorator3(Sourcable source) { super(); this.source = source; } @Override public void operation() { // TODO Auto-generated method stub System.out.println("第3個裝飾器裝飾前"); source.operation(); System.out.println("第3個裝飾器裝飾後"); } } |
測試類 : public class DecoratorTest { public static void main(String[] args) { Sourcable source=new Source(); Sourcable obj=new Decorator1( new Decorator2( new Decorator3(source))); // Sourcable obj=new Decorator2(source); obj.operation(); } } |
結果: 第1個裝飾器裝飾前 第2個裝飾器裝飾前 第3個裝飾器裝飾前 原始類的方法 第3個裝飾器裝飾後 第2個裝飾器裝飾後 第1個裝飾器裝飾後 |
在以下情況使用: 需要擴展一個類的功能,或者給一個類增加附加的功能 需要給一個對象增加功能,這些功能可以動態撤銷 需要增加由一些基本排列組合產生大量的功能,從而使繼承關係變得不現實 |
缺點: 較少的使用類,但會產生更多的對象,在進行錯誤查詢時變得更困難。 |