本文主要是介绍”万丈高楼平地起“——如何从“建筑师”角度打造【装饰者设计模式】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
什么是装饰者模式
在不改变原有对象的基础上附加功能,相比生成子类更灵活。
装饰者模式应用场景
过滤器,网关控制,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);}@Overridepublic void service() {super.service();System.out.println("第二步>>> 网关中新增日志收集..");}
}/*** 网关新增API接口限流具体操作【装饰者】* ApiLimitDecorator:相当于在第第一层楼上建造第二层*/
public class ApiLimitDecorator extends AbstractDecorator {public ApiLimitDecorator(GatewayComponent gatewayComponent) {super(gatewayComponent);}@Overridepublic 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执行具体被装饰类,再反向从装饰类开始执行(反向流程)
知识分享
本文参考:蚂蚁课堂
这篇关于”万丈高楼平地起“——如何从“建筑师”角度打造【装饰者设计模式】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!