您现在的位置是:首页 > 文章详情

”万丈高楼平地起“——如何从“建筑师”角度打造【装饰者设计模式】

日期:2019-05-15点击:269

写在前面:设计模式源于生活,而又高于生活!

什么是装饰者模式

不改变原有对象的基础上附加功能,相比生成子类更灵活。

装饰者模式应用场景

过滤器,网关控制,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执行具体被装饰类,再反向从装饰类开始执行(反向流程)

版权@须臾之余https://my.oschina.net/u/3995125

本文参考:蚂蚁课堂

原文链接:https://my.oschina.net/u/3995125/blog/3049709
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章