什麼是裝飾者模式設計模式
在不改變原有對象的基礎上附加功能,相比生成子類更靈活。緩存
裝飾者模式應用場景ide
過濾器,網關控制,P2P分控審批this
裝飾者模式類圖spa
裝飾者模式定義.net
(1)抽象組件:定義一個抽象接口,來規範準備附加功能的類設計
(2)具體組件:將要被附加功能的類,實現抽象構件角色接口日誌
(3)抽象裝飾者:持有對具體構件角色的引用並定義與抽象構件角色一致的接口code
(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 緩存中的裝飾者模式
它基於字符流(InputStream/OutputStream) 和 字節流(Reader/Writer)做爲基類,下面畫出InputStream、Reader的抽象構造角色 Reader,FilterReader 抽象的裝飾類
責任鏈實現原理
每一個被調用者 都持有下一個 被調用者 的引用,客戶端只須要發起一次調用便可。
裝飾的實現原理
持有被裝飾的對象,並具有被裝飾者 的行爲,對其行爲進行補充加強
二者區別
責任鏈模式原理:經過指向下一個handler的方法,順序依據鏈表執行,指向下一個節點(正向流程)
裝飾者模式原理:經過super執行具體被裝飾類,再反向從裝飾類開始執行(反向流程)
版權@須臾之餘https://my.oschina.net/u/3995125
本文參考:螞蟻課堂