設計模式之Decorator

Decorator常被翻譯成"裝飾",油漆工(decorator)是用來刷油漆的,那麼被刷油漆的對象咱們稱decoratee.這兩種實體在Decorator模式中是必須的.html

Decorator定義:
動態給一個對象添加一些額外的職責,就象在牆上刷油漆.使用Decorator模式相比用生成子類方式達到功能的擴充顯得更爲靈活.
java

 

舉個網上的例子:this

 

在Decorator模式中,咱們是要在打樁時增長一些額外功能,好比,挖坑 在樁上釘木板等,不關心如何使用兩個不相關的類.spa

 

   

咱們先創建一個接口:翻譯

public interface Work

  public void insert();
htm

}對象

接口Work有一個具體實現:插入方形樁或圓形樁,這兩個區別對Decorator是無所謂.咱們以插入方形樁爲例:繼承

public class SquarePeg implements Work{
  public void insert(){
    System.out.println("方形樁插入");
  }
接口

}ci

如今有一個應用:須要在樁打入前,挖坑,在打入後,在樁上釘木板,這些額外的功能是動態,可能隨意增長調整修改,好比,可能又須要在打樁以後釘架子(只是比喻).

那麼咱們使用Decorator模式,這裏方形樁SquarePeg是decoratee(被刷油漆者),咱們須要在decoratee上刷些"油漆",這些油漆就是那些額外的功能.

public class Decorator implements Work{

  private Work work;
  //額外增長的功能被打包在這個List中
  private ArrayList others = new ArrayList();

  //在構造器中使用組合new方式,引入Work對象;
  public Decorator(Work work)
  {
    this.work=work;
   
    others.add("挖坑");

    others.add("釘木板");
  }

  public void insert(){

    newMethod();
  }


  
  //在新方法中,咱們在insert以前增長其餘方法,這裏次序前後是用戶靈活指定的    
  public void newMethod()
  {
    otherMethod();
    work.insert();


  }

  public void otherMethod()
  {
    ListIterator listIterator = others.listIterator();
    while (listIterator.hasNext())
    {
      System.out.println(((String)(listIterator.next())) + " 正在進行");
    }

  }

}

在上例中,咱們把挖坑和釘木板都排在了打樁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變種不少,若是都採起繼承方法,將會產生不少子類,顯然至關繁瑣.

相關文章
相關標籤/搜索