”万丈高楼平地起“——如何从“建筑师”角度打造【装饰者设计模式】
写在前面:设计模式源于生活,而又高于生活!
什么是装饰者模式
在不改变原有对象的基础上附加功能,相比生成子类更灵活。
装饰者模式应用场景
过滤器,网关控制,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
本文参考:蚂蚁课堂

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
大话文本检测经典模型:SegLink
在自然场景中,例如灯箱广告牌、产品包装盒、商标等,要检测出其中的文字会面临着各种复杂的情况,例如角度倾斜、变形等情况,这时就需要使用基于深度学习的方法进行文字检测。在之前的文章中,介绍了基于卷积神经网络和循环神经网络的CTPN文本检测方法(见文章:大话文本检测经典模型 CTPN),该方法能在自然场景下较好地实现对文字的检测,但在CTPN中给出的文本检测效果是基于水平方向的,对于非水平的文本检测效果并不好,而在自然场景中,很多的文本信息都是带有一定的旋转角度的,例如用手机拍街道上的指示牌,如下图。如果文本检测的结果只有水平方向的,没有带角度信息,那么下图指示牌检测出来的就是红色框结果,而其实绿色框才是理想的检测目标,可见检测的结果误差太大。 那要怎样才能实现对各种角度的灵活检测呢?一个最直接的思路就是让模型不仅能学习和输出边框的位置(x, y, w, h),还要能输出一个文本框的旋转角度参数θ。本文要介绍的文本检测模型SegLink,便是采用了这个思路,也即SegLink检测模型能检测有旋转角度的文本,如下图: 一、SegLink模型的主要思想 SegLink模型的检测过程主要如下: ...
- 下一篇
etcd 在超大规模数据场景下的性能优化
作者 | 阿里云智能事业部高级开发工程师 陈星宇(宇慕) 概述 etcd是一个开源的分布式的kv存储系统, 最近刚被cncf列为沙箱孵化项目。etcd的应用场景很广,很多地方都用到了它,例如kubernetes就用它作为集群内部存储元信息的账本。本篇文章首先介绍我们优化的背景,为什么我们要进行优化, 之后介绍etcd内部存储系统的工作方式,之后介绍本次具体的实现方式及最后的优化效果。 优化背景 由于阿里巴巴内部集群规模大,所以对etcd的数据存储容量有特殊需求,之前的etcd支持的存储大小无法满足要求, 因此我们开发了基于etcd proxy的解决方案,将数据转储到了tair中(可类比redis))。这种方案虽然解决了数据存储容量的问题,但是弊端也是比较明显的,由于proxy需要将数据进行搬移,因此操作的延时比原生存储大了很多。除此之外,由于多了tair这个组件,运维和管理成本较高。因此我们就想到底是什么原因限制了etcd的存储容量,我们是否可以通过技术手段优化解决呢? 提出了如上问题后我们首先进行了压力测试不停地像etcd中注入数据,当etcd存储数据量超过40GB后,经过一次com...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2全家桶,快速入门学习开发网站教程
- MySQL8.0.19开启GTID主从同步CentOS8
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题