Decorator常被翻譯成"裝飾",油漆工(decorator)是用來刷油漆的,那麼被刷油漆的對象咱們稱decoratee.這兩種實體在Decorator模式中是必須的.html
Decorator定義:
動態給一個對象添加一些額外的職責,就象在牆上刷油漆.使用Decorator模式相比用生成子類方式達到功能的擴充顯得更爲靈活.java
舉個網上的例子:this
在Decorator模式中,咱們是要在打樁時增長一些額外功能,好比,挖坑 在樁上釘木板等,不關心如何使用兩個不相關的類.spa
咱們先創建一個接口:翻譯
public interface Work }對象 |
接口Work有一個具體實現:插入方形樁或圓形樁,這兩個區別對Decorator是無所謂.咱們以插入方形樁爲例:繼承
public class SquarePeg implements Work{ }ci |
如今有一個應用:須要在樁打入前,挖坑,在打入後,在樁上釘木板,這些額外的功能是動態,可能隨意增長調整修改,好比,可能又須要在打樁以後釘架子(只是比喻).
那麼咱們使用Decorator模式,這裏方形樁SquarePeg是decoratee(被刷油漆者),咱們須要在decoratee上刷些"油漆",這些油漆就是那些額外的功能.
public class Decorator implements Work{ private Work work; //在構造器中使用組合new方式,引入Work對象; others.add("釘木板"); public void insert(){ newMethod();
public void otherMethod() } |
在上例中,咱們把挖坑和釘木板都排在了打樁insert前面,這裏只是舉例說明額外功能次序能夠任意安排.
好了,Decorator模式出來了,咱們看如何調用:
Work squarePeg = new SquarePeg();
Work decorator = new Decorator(squarePeg);
decorator.insert();
Decorator模式至此完成.
若是你細心,會發現,上面調用相似咱們讀取文件時的調用:
FileReader fr = new FileReader(filename);
BufferedReader br = new BufferedReader(fr);
實際上Java 的I/O API就是使用Decorator實現的,I/O變種不少,若是都採起繼承方法,將會產生不少子類,顯然至關繁瑣.