写在前面:设计模式源于生活,而又高于生活!
什么是装饰者模式
装饰者模式应用场景
装饰者模式类图
装饰者模式定义
装饰者代码实现
定义一个抽象的接口
/**
* 定义【抽象构建角色】: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();
}
}
输出结果
源码角度分析装饰者模式
Java I/O 中的装饰者模式
它基于字符流(InputStream/OutputStream) 和 字节流(Reader/Writer)作为基类,下面画出InputStream、Reader的抽象构造角色 Reader,FilterReader 抽象的装饰类
责任链与装饰模式区别
责任链实现原理
装饰的实现原理
两者区别