什麼是裝飾者模式
在不改變原有對象的基礎上附加功能,相比生成子類更靈活。
裝飾者模式應用場景
過濾器,網關控制,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執行具體被裝飾類,再反向從裝飾類開始執行(反向流程)
知識分享
本文參考:螞蟻課堂