天天看點

設計模式(七)—— 裝飾器模式

裝飾器模式的定義與特點

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

裝飾器模式的主要優點有:

  • 不改變原類檔案。
  • 不使用繼承。
  • 動态擴充。

其主要缺點是:裝飾器模式會增加許多子類,過度使用會增加程式得複雜性。

裝飾器模式的結構與實作

1. 模式的結構

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

  1. 抽象構件(Component)角色:定義一個抽象接口以規範準備接收附加責任的對象。
  2. 具體構件(ConcreteComponent)角色:實作抽象構件,通過裝飾角色為其添加一些職責。
  3. 抽象裝飾(Decorator)角色:繼承抽象構件,并包含具體構件的執行個體,可以通過其子類擴充具體構件的功能。
  4. 具體裝飾(ConcreteDecorator)角色:實作抽象裝飾的相關方法,并給具體構件對象添加附加的責任。

裝飾器模式的結構圖如圖 1 所示。

設計模式(七)—— 裝飾器模式

圖1 裝飾器模式的結構圖

2. 模式的實作

//抽象構件角色
interface Component {
    public void operation();
}

//具體構件角色
class ConcreteComponent implements Component {
    public ConcreteComponent() {
        System.out.println("建立具體構件角色");
    }

    public void operation() {
        System.out.println("調用具體構件角色的方法operation()");
    }
}

//抽象裝飾角色
abstract class Decorator implements Component {
    private Component component;

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

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

//具體裝飾角色
class ConcreteDecorator extends Decorator {
    public ConcreteDecorator(Component component) {
        super(component);
    }

    public void operation() {
        super.operation();
        addedFunction();
    }

    public void addedFunction() {
        System.out.println("為具體構件角色增加額外的功能addedFunction()");
    }
}


//使用
public class DecoratorPattern {
    public static void main(String[] args) {
        Component p = new ConcreteComponent();
        p.operation();
        
        Component d = new ConcreteDecorator(p);
        d.operation();
    }
}
           

裝飾器模式的應用執行個體

1. java IO

繼續閱讀