”萬丈高樓平地起“——如何從“建築師”角度打造【裝飾者設計模式】

什麼是裝飾者模式

不改變原有對象的基礎上附加功能,相比生成子類更靈活。

裝飾者模式應用場景

過濾器,網關控制,P2P分控審批

裝飾者模式類圖

裝飾者模式定義

(1)抽象組件:定義一個抽象接口,來規範準備附加功能的類

(2)具體組件:將要被附加功能的類,實現抽象構件角色接口

(3)抽象裝飾者:持有對具體構件角色的引用並定義與抽象構件角色一致的接口

(4)具體裝飾:實現抽象裝飾者角色,負責對具體構件添加額外功能。

裝飾者代碼實現

定義一個抽象的接口

/**
 * 定義【抽象構建角色】:GatewayComponent
 * GatewayComponent:相當與建築師設計好高樓的建造目標
 */
public abstract class GatewayComponent {

    /**
     * 定義共同行爲的方法標準
     */
    public abstract void service();

}

定義被裝飾角色

/**
 * 【網關獲取基本參數】,BasicComponentGateway【被裝飾的類】
 * BasicComponentGateway:相當於建房子的【地基】
 */
public class BasicComponentGateway extends GatewayComponent {
    public void service() {
        System.out.println("第一步>>> 網關中獲取基本的操作實現...");
    }
}

定義抽象裝飾角色

/**
 * 抽象裝飾者:AbstractDecorator,定義【被裝飾者】與【具體裝飾者】共同行爲
 * AbstractDecorator:相當於工人怎麼去建好每一層樓
 */
public class AbstractDecorator extends GatewayComponent {

    public GatewayComponent gatewayComponent;

    public AbstractDecorator(GatewayComponent gatewayComponent){
        this.gatewayComponent = gatewayComponent;
    }
    public void service() {
        if(gatewayComponent!=null){
            gatewayComponent.service();
        }
    }
}

定義具體裝飾角色

/**
 * 網關新增日誌收集LogDecorator,【裝飾者】
 * LogDecorator:相當於地基之上搭建第一層
 */
public class LogDecorator extends AbstractDecorator {
    public LogDecorator(GatewayComponent gatewayComponent) {
        super(gatewayComponent);
    }
    @Override
    public void service() {
        super.service();
        System.out.println("第二步>>> 網關中新增日誌收集..");
    }
}

/**
 * 網關新增API接口限流具體操作【裝飾者】
 * ApiLimitDecorator:相當於在第第一層樓上建造第二層
 */
public class ApiLimitDecorator extends AbstractDecorator {
    public ApiLimitDecorator(GatewayComponent gatewayComponent) {
        super(gatewayComponent);
    }
    @Override
    public void service() {
        super.service();
        System.out.println("第三步>>> 網關中新增API接口的限流...");

    }
}

獲取裝飾類

public class FactoryGateway {

    public static GatewayComponent getGatewayComponent() {
        //第二層->第一層->地基
        return new ApiLimitDecorator(new LogDecorator(new BasicComponentGateway()));
    }

    public static void main(String[] args) {
        GatewayComponent gatewayComponent = FactoryGateway.getGatewayComponent();
        //地基->第一層->第二層
        gatewayComponent.service();
    }
}

輸出結果

版權@須臾之餘https://my.oschina.net/u/3995125

第一步>>> 網關中獲取基本的操作實現...
第二步>>> 網關中新增日誌收集..
第三步>>> 網關中新增API接口的限流...

源碼角度分析裝飾者模式

Java I/O 中的裝飾者模式

Spring Session 中的裝飾者模式

Mybatis 緩存中的裝飾者模式

Java I/O 中的裝飾者模式

它基於字節流(InputStream/OutputStream) 和 字符流(Reader/Writer)作爲基類,下面畫出InputStream、Reader的抽象構造角色   Reader,FilterReader  抽象的裝飾類

責任鏈與裝飾模式區別

責任鏈實現原理

每個被調用者 都持有下一個 被調用者 的引用,客戶端只需要發起一次調用即可。

裝飾的實現原理

持有被裝飾的對象,並具備被裝飾者 的行爲,對其行爲進行補充增強

兩者區別

責任鏈模式原理:通過指向下一個handler的方法,順序依據鏈表執行,指向下一個節點(正向流程)

裝飾者模式原理:通過super執行具體被裝飾類,再反向從裝飾類開始執行(反向流程)

知識分享

本文參考:螞蟻課堂

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