文档章节

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

须臾之余
 须臾之余
发布于 05/15 09:41
字数 950
阅读 192
收藏 3

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

什么是装饰者模式

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

装饰者模式应用场景

过滤器,网关控制,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();
    }
}

输出结果

第一步>>> 网关中获取基本的操作实现...
第二步>>> 网关中新增日志收集..
第三步>>> 网关中新增API接口的限流...

源码角度分析装饰者模式

Java I/O 中的装饰者模式

Spring Session 中的装饰者模式

Mybatis 缓存中的装饰者模式

Java I/O 中的装饰者模式

它基于字符流(InputStream/OutputStream) 和 字节流(Reader/Writer)作为基类,下面画出InputStream、Reader的抽象构造角色   Reader,FilterReader  抽象的装饰类

责任链与装饰模式区别

责任链实现原理

每个被调用者 都持有下一个 被调用者 的引用,客户端只需要发起一次调用即可。

装饰的实现原理

持有被装饰的对象,并具备被装饰者 的行为,对其行为进行补充增强

两者区别

责任链模式原理:通过指向下一个handler的方法,顺序依据链表执行,指向下一个节点(正向流程)

装饰者模式原理:通过super执行具体被装饰类,再反向从装饰类开始执行(反向流程)

© 著作权归作者所有

须臾之余
粉丝 39
博文 12
码字总数 17166
作品 0
吉安
程序员
私信 提问
《JavaScript设计模式与开发实践》模式篇(12)—— 装饰者模式

在传统的面向对象语言中,给对象添加功能常常使用继承的方式,但是继承的方式并不灵活, 还会带来许多问题:一方面会导致超类和子类之间存在强耦合性,当超类改变时,子类也会随之 改变;另一方...

嗨呀豆豆呢
2018/12/25
0
0
ES7 Decorator 装饰者模式

原作者:玄农 装饰模式 设计模式大家都有了解,网上有很多系列教程,比如 JS设计模式等等。 这里只分享 装饰者模式 以及在 如何使用 ES7 的 概念 装饰模式 v.s. 适配器模式 装饰模式和适配器...

_朴灵_
2018/05/14
0
0
Java 设计模式(14) —— 复合模式

一、复合模式 模式常一起使用,组合在一个设计解决方案中 复合模式在一个解决方案中结合两个或多个模式,能解决一般性或一系列的问题 二、示例 本次设计模式讲解中无代码示例,由于复合模式是...

磊_lei
2018/05/26
0
0
Java 中的 GoF 设计模式(第一部分)

为了理解 GoF(Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 四人组)的设计模式原理和历史,我制作了一个 10 分钟的短视频。(作为 PluralSight 作者试录的) 视频:https...

王桥修道院副院长
2017/02/13
2.6K
3
装饰者模式 && ES7 decorator装饰器

装饰者模式 在提及这个新特性前我们先了解一下设计模式中的装饰者模式。 定义 装饰者模式能够在不改变对象自身的基础上,在程序运行期间给对像动态的添加职责。与继承相比,装饰者是一种更轻...

Eason_Wong
2018/09/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

运维规范

命名规范 发布流程 监控告警 故障定位 状态 日志 监控

以谁为师
45分钟前
2
0
约瑟夫环(报数游戏)java实现

开端 公司组织考试,一拿到考题,就是算法里说的约瑟夫环,仔细想想 以前老师将的都忘了,还是自己琢磨把~ package basic.gzy;import java.util.Iterator;import java.util.LinkedList;...

无极之岚
今天
2
0
Kernel字符设备驱动框架

Linux设备分为三大类:字符设备,块设备和网络设备,这三种设备基于不同的设备框架。相较于块设备和网络设备,字符设备在kernel中是最简单的,也是唯一没有基于设备基础框架(device结构)的...

yepanl
今天
3
0
Jenkins 中文本地化的重大进展

本文首发于:Jenkins 中文社区 我从2017年开始,参与 Jenkins 社区贡献。作为一名新成员,翻译可能是帮助社区项目最简单的方法。 本地化的优化通常是较小的改动,你无需了解项目完整的上下文...

Jenkins中文社区
昨天
4
0
Spring中如何使用设计模式

关于设计模式,如果使用得当,将会使我们的代码更加简洁,并且更具扩展性。本文主要讲解Spring中如何使用策略模式,工厂方法模式以及Builder模式。 1. 策略模式 关于策略模式的使用方式,在S...

爱宝贝丶
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部