java之裝飾器模式


Decorator Pattern(裝飾器模式),定義:Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality.(動態地給一個對象添加一些額外的職責。就增加功能來說,裝飾模式相比生成子類更為靈活)

裝飾器的通用視圖:

 

上圖四個角色解釋一下:

1.Component抽象構件:

Component是一個接口或者一個抽象類,就是定義我們最核心的對象,也就是最原始的對象,最高層次的抽象,統一整個裝飾器系統,用於裝飾器之間溝通的橋梁,就像II/O流中的InputStream,OutputStream一樣

2.ConcreteComponent具體構件

ConcreteComponent是最核心,最原始,最基本的接口或者抽象類的實現,你要裝飾的就是它,裝飾的源頭,你裝飾的最底層,就像I/O流一樣,這就直接跟底層打交道的節點流,就比如FileInputStream

3.Decorator 裝飾角色

一般是一個抽象類,實現接口或者抽象方法,它並不一定有抽象方法,但在它的屬性里必須有一個private變量指向Component抽象構件,一般是用構造器初始化。就像I/O流中的FilterInputStream

4.ConcreteDecoratorA,ConcreteDecoratorB具體的裝飾器角色,這就是要將我們之間建的最核心,最原始,最基礎的東西裝飾成東西或者其他的東西,就像I/O中的BufferedInputStream,DataInputStream等。

下面給出一個簡單的例子:

  1 package decorator;
  2 //抽象構件
  3 public interface Component
  4 {
  5     void operation();
  6 }
  7 //具體的抽象構件的實現
  8 public class ConcreteComponent implements Component
  9 {
 10 
 11     /** { @inheritDoc } */
 12     @Override
 13     public void operation()
 14     {
 15         System.out.println("我是ConcreteComponent,是最原始的實現類,我處於最底層");
 16     }
 17     
 18 }
 19 //抽象裝飾器
 20 public abstract class Decorator implements Component
 21 {
 22     private Component component;
 23 
 24     /** 
 25      * @param component 
 26      */ 
 27     public Decorator(Component component)
 28     {
 29         this.component = component;
 30     }
 31     
 32     /** { @inheritDoc } */
 33     @Override
 34     public void operation()
 35     {
 36         component.operation();
 37     }
 38 }
 39 //具體裝飾器A
 40 public class ConcreteDecoratorA extends Decorator
 41 {
 42 
 43     /** 
 44      * @param component 
 45      */ 
 46     public ConcreteDecoratorA(Component component)
 47     {
 48         super(component);
 49     }
 50     
 51     public void methodA() 
 52     {
 53         System.out.println("我是ConcreteDecoratorA,添加的新功能");
 54     }
 55     
 56     /** { @inheritDoc } */
 57     @Override
 58     public void operation()
 59     {
 60         methodA();
 61         super.operation();
 62         System.out.println("ConcreteDecoratorA的operation執行完畢");
 63     }
 64 
 65 }
 66 //具體裝飾器B
 67 public class ConcreteDecoratorB extends Decorator
 68 {
 69 
 70     /** 
 71      * @param component 
 72      */ 
 73     public ConcreteDecoratorB(Component component)
 74     {
 75         super(component);
 76     }
 77     
 78     public void methodB() 
 79     {
 80         System.out.println("我是ConcreteDecoratorB,添加的新功能");
 81     }
 82     
 83     /** { @inheritDoc } */
 84     @Override
 85     public void operation()
 86     {
 87         methodB();
 88         super.operation();
 89         System.out.println("ConcreteDecoratorB的operation執行完畢");
 90     }
 91 
 92 }
 93 //測試類
 94 public class Demo
 95 {
 96     public static void main(String[] args)
 97     {
 98         Component component = new ConcreteComponent();
 99         
100         ConcreteDecoratorB decoratorB = new ConcreteDecoratorB(new ConcreteDecoratorA(component));
101         
102         decoratorB.operation();
103     }
104 }

 上邊的例子是用最原始的類使用接口實現的,同樣也可以采用抽象類實現,在此不再貼代碼了,測試類的大致代碼走向,即實際的裝飾流程

 


裝飾器模式的優缺點:

優點:

1.相比與靜態的繼承,裝飾器模式正如它定義的,那樣可以動態的給一個對象添加額外的職責, 顯得更加靈活。靜態繼承的情況下,如果要添加其他的功能就需要添加新的子類實現功能,然后相互之間繼承,以達到一個組合的功能,對於每一個要添加的功能都要,新建類,顯得特別麻煩,也使得系統越來越復雜,而對於裝飾器來說,為一個特定的Component提供多種不同的Decorator,對於一些要達成的功能,相互組合就可以達成目的

2.裝飾類和被裝飾類可以獨立發展,而不會相互耦合

3.裝飾模式是繼承關系的一個替代方案。我們看裝飾類Decorator,不管裝飾多少層,返回的對象還是Component,實現的還是is-a的關系

缺點:

對於裝飾模式記住一點就足夠了:多層的裝飾是比較復雜的。為什么會復雜呢?你想想看,就像剝洋蔥一樣,你剝到了最后才發現是最里層的裝飾出現了問題,想象一下工作量吧,因此,盡量減少裝飾類的數量,以便降低系統的復雜度


與裝飾難解難分的I/O系統


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM