前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >”万丈高楼平地起“——如何从“建筑师”角度打造【装饰者设计模式】

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

作者头像
须臾之余
发布2019-07-05 15:03:52
3210
发布2019-07-05 15:03:52
举报
文章被收录于专栏:须臾之余须臾之余

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

什么是装饰者模式

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

装饰者模式应用场景

过滤器,网关控制,P2P分控审批

装饰者模式类图

装饰者模式定义

(1)抽象组件:定义一个抽象接口,来规范准备附加功能的类 (2)具体组件:将要被附加功能的类,实现抽象构件角色接口 (3)抽象装饰者:持有对具体构件角色的引用并定义与抽象构件角色一致的接口 (4)具体装饰:实现抽象装饰者角色,负责对具体构件添加额外功能。

装饰者代码实现

定义一个抽象的接口

代码语言:javascript
复制
/**
 * 定义【抽象构建角色】:GatewayComponent
 * GatewayComponent:相当与建筑师设计好高楼的建造目标
 */
public abstract class GatewayComponent {

    /**
     * 定义共同行为的方法标准
     */
    public abstract void service();

}

定义被装饰角色

代码语言:javascript
复制
/**
 * 【网关获取基本参数】,BasicComponentGateway【被装饰的类】
 * BasicComponentGateway:相当于建房子的【地基】
 */
public class BasicComponentGateway extends GatewayComponent {
    public void service() {
        System.out.println("第一步>>> 网关中获取基本的操作实现...");
    }
}

定义抽象装饰角色

代码语言:javascript
复制
/**
 * 抽象装饰者: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();
        }
    }
}

定义具体装饰角色

代码语言:javascript
复制
/**
 * 网关新增日志收集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接口的限流...");

    }
}

获取装饰类

代码语言:javascript
复制
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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 装饰者代码实现
    • 源码角度分析装饰者模式
      • Java I/O 中的装饰者模式
    • 责任链与装饰模式区别
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档