裝飾模式淺析(1)

      裝飾(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的設計原則:優先組合對象而不是繼承.

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章