裝飾(Decorator)模式是動態給一個對象添加一些額外的職責,或者說改變這個對象的一些行爲。 這就類似於使用油漆爲某個東西刷上油漆,在原來的對象表面增加了一層外衣。
在裝飾模式中,有兩個主要角色:
1. 被刷油漆的對象(decoratee);
2. 給decoratee刷油漆的對象(decorator)。
這兩個對象都繼承同一個接口。
下面就通過一個簡單的例子演示裝飾模式的實現:
1, 爲實現打樁操作先定義一個接口
/**
* Created by IntelliJ IDEA.
* User: Administrator
* Date: 2006-6-29
* Time: 15:03:20
* 類功能說明:
* 爲打樁定義一個接口類
*/
public interface Work {
/** 打樁工作的抽象接口 */
public void insert();
}
2. 實現表示方形木樁的插入的類
/**
* Created by IntelliJ IDEA.
* User: Administrator
* Date: 2006-6-29
* Time: 15:05:22
* 類功能說明:
* 打方形樁實現類
*/
public class SquarePeg implements Work {
public void insert(){
System.out.println("打入方形木樁");
}
}
3. 用SquarePeg 類也許就可以滿足打樁的工作需要,但是有可能土質很硬,在插入方形樁之前先要打一個洞,那麼又將如何實現?也就是說在執行打樁操作之前還需要額外的工作,我們已經有了一個實現打樁的類SquarePeg,如何在不改變此類的基礎上實現額外的功能呢?我們可以採用裝飾模式,可以編制一個Decorator類,同樣繼承Work接口,但是在實現insert方法時有些特別,需要添加額外的功能.
/**
* Created by IntelliJ IDEA.
* User: Administrator
* Date: 2006-6-29
* Time: 15:07:39
* To change this template use File | Settings | File Templates.
*
* ---------------------------------------------------------------
* 裝飾(Decorator)模式是動態給一個對象添加一些額外的職責,或者說改變這個對象的一些行爲。
* 這就類似於使用油漆爲某個東西刷上油漆,在原來的對象表面增加了一層外衣。
* 在裝飾模式中,有兩個主要角色:
* 1. 被刷油漆的對象(decoratee);
* 2. 給decoratee刷油漆的對象(decorator)。
* 這兩個對象都繼承同一個接口。
*
* 裝飾模式關鍵點:
* 1.decoratee和decorator實現同一個接口
* 2.在decorator類的構造方法帶有一個接口Work的參數,且本地保存一個Work接口的實例
* 3.在insert方法中添加額外的功能
* ---------------------------------------------------------------
*/
import java.util.List;
import java.util.ArrayList;
import java.util.ListIterator;
public class Decorator implements Work {
private Work work;
//額外的功能放在這個list中
private List others = new ArrayList();
public Decorator(Work work){
this.work = work;
//增加打洞的額外功能
others.add("打洞");
}
public void insert(){
//在打樁之前需要加入額外的功能才能再進行操作
otherMethod();
work.insert();
}
public void otherMethod(){
ListIterator listIterator = others.listIterator();
while(listIterator.hasNext()){
System.out.println(listIterator.next() + " 正在進行");
}
}
}
在Decorator的方法insert中先執行otherMethod()方法,然後才實現SquarePeg的insert方法。油漆工Decorator給被油漆者SquarePeg添加了新的行爲——打洞。
4. 測試裝飾模式的實現效果
/**
* Created by IntelliJ IDEA.
* User: Administrator
* Date: 2006-6-29
* Time: 15:17:06
* 類功能說明:
* 裝飾模式測試類.
*/
public class Test {
public static void main(String[] args){
Work squarePeg = new SquarePeg();
Work decorator = new Decorator(squarePeg);
decorator.insert();
}
}
本例中只添加了一個新的行爲(打洞),如果還有很多類似的行爲,那麼使用裝飾模式的優點就體現出來了。因爲可以通過另外一個角度(如組織新的油漆工實現子類)來對這些行爲進行混合和匹配,這樣就不必爲每個行爲創建一個類,從而減少了系統的複雜性。
使用裝飾模式可以避免在被油漆對象decoratee中包裝很多動態的,可能需要也可能不需要的功能,只要在系統真正運行時,通過油漆工decorator來檢查那些需要加載的功能,實行動態加載。
裝飾模式也很好的表現出java的設計原則:優先組合對象而不是繼承.