設計模式之裝飾者模式

一、定義

裝飾(Decorator)模式的定義:指在不改變現有對象結構的情況下,動態地給該對象增加一些職責(即增加其額外功能)的模式,它屬於對象結構型模式。

二、優缺點

優點:

  • 採用裝飾模式擴展對象的功能比採用繼承方式更加靈活。
  • 可以設計出多個不同的具體裝飾類,創造出多個不同行爲的組合。

缺點:

  • 裝飾模式增加了許多子類,如果過度使用會使程序變得很複雜。

三、代碼實現舉例

(1)創建一個接口

public interface Component {
    public void operation();
}

(2)創建實現接口的實體類

public class F_Component implements Component {
    @Override
    public void operation() {
        System.out.println("This is F_Component!!!");
    }
}

public class S_Component implements Component {
    @Override
    public void operation() {
        System.out.println("This is S_Component!!!");
    }
}

(3)創建實現了 Component 接口的抽象裝飾類

public abstract class ComponentDecorator implements Component {
    protected Component component;

    public ComponentDecorator(Component component) {
        this.component = component;
    }

    @Override
    public void operation() {
       component.operation();
    }
}

(4)創建擴展了 ComponentDecorator 類的實體裝飾類

public class OneComponentDecorator extends ComponentDecorator {
    public OneComponentDecorator(Component component) {
        super(component);
    }

    @Override
    public void operation() {
        component.operation();
        setOne(component);
    }

    private void setOne(Component component){
        System.out.println("This is OneComponentDecorator!!! ");
    }
}

(5)使用 OneComponentDecorator 來裝飾 Component對象。

public class DecortorTest {

    public static void main(String[] args) {
        F_Component f_component = new F_Component();
        ComponentDecorator f_cd = new OneComponentDecorator(new F_Component());
        ComponentDecorator s_cd = new OneComponentDecorator(new S_Component());
        System.out.println("--- F_Component -----");
        f_component.operation();
        System.out.println("--- f_cd -----");
        f_cd.operation();
        System.out.println("--- s_cd -----");
        s_cd.operation();
    }

}

輸出:

--- F_Component -----
This is F_Component!!!
--- f_cd -----
This is F_Component!!!
This is OneComponentDecorator!!! 
--- s_cd -----
This is S_Component!!!
This is OneComponentDecorator!!! 

四、總結

裝飾模式主要包含以下角色。

  1. 抽象構件(Component)角色:定義一個抽象接口以規範準備接收附加責任的對象。
  2. 具體構件(Concrete    Component)角色:實現抽象構件,通過裝飾角色爲其添加一些職責。
  3. 抽象裝飾(Decorator)角色:繼承抽象構件,幷包含具體構件的實例,可以通過其子類擴展具體構件的功能。
  4. 具體裝飾(ConcreteDecorator)角色:實現抽象裝飾的相關方法,並給具體構件對象添加附加的責任。
發佈了62 篇原創文章 · 獲贊 14 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章