1. 程式人生 > 其它 >設計模式07-裝飾模式(Decorator)

設計模式07-裝飾模式(Decorator)

通過實現與被裝飾類實現的相同介面或父類,並將被裝飾類作為屬性注入到裝飾器物件中來完成對裝飾器模式的應用。 裝飾器模式重點在於呼叫方對整個過程無感知,仍然呼叫原先實現的介面或父類方法即可。

設計模式07-裝飾模式(Decorator)

概述

通過實現與被裝飾類實現的相同介面或父類,並將被裝飾類作為屬性注入到裝飾器物件中來完成對裝飾器模式的應用。

裝飾器模式重點在於呼叫方對整個過程無感知,仍然呼叫原先實現的介面或父類方法即可。

和介面卡模式的比較

裝飾器與介面卡都有一個別名叫做 包裝模式(Wrapper),它們看似都是起到包裝一個類或物件的作用,但是使用它們的目的很不一一樣。

介面卡模式的意義是要將一個介面轉變成另一個介面,它的目的是通過改變介面來達到重複使用的目的。

而裝飾器模式不是要改變被裝飾物件的介面,而是恰恰要保持原有的介面,但是增強原有物件的功能,或者改變原有物件的處理方式而提升效能。

所以這兩個模式設計的目的是不同的。

簡單實踐

JDK實現

1、現在有介面 Source 及其實現類 codingSourceImpl,如果想在不修改已有類且繼續通過 Source 型別的宣告來呼叫的情況下對execute功能做修改,即可使用裝飾器模式。

public interface Source {
    void execute();
}

public class SourceImpl implements Source {
    @Override
    public void execute() {
    }
}

2、建立 SourceImpl 的裝飾器類,該類要實現 Source

介面並將要被裝飾的 Source 型別的實現類作為屬性。

public class SourceDecorator implements Source {
    private final Source source;
    SourceDecorator(Source source) {
        super();
        this.source = source;
    }

    @Override
    public void execute() {
        source.method();
    }
}

3、呼叫裝飾器類 SourceDecorator

方式示例如下:

public class DecoratorPattern {
    public static void main(String[] args) {
        Source source = new SourceImpl();
        Source decorator = SourceDecorator.builder().source(source).build();
        decorator.execute();
    }
}

原始碼解析

JDK InputStream流

java.io.FilterInputStream

public class FilterInputStream extends InputStream {
    protected volatile InputStream in;

    protected FilterInputStream(InputStream in) {
        this.in = in;
    }

FilterInputStream 通過持有實現相同父類的物件,來對該物件功能作增強。