前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >常用开源框架中设计模式使用分析- 装饰器模式(Decorator Pattern)

常用开源框架中设计模式使用分析- 装饰器模式(Decorator Pattern)

作者头像
加多
发布2018-09-06 14:50:33
1.2K0
发布2018-09-06 14:50:33
举报
文章被收录于专栏:Java编程技术Java编程技术

九、装饰器模式(Decorator Pattern)

9.1 介绍

装饰器模式是一种结构性模式,它作用是对对象已有功能进行增强,但是不改变原有对象结构。这避免了通过继承方式进行功能扩充导致的类体系臃肿。

装饰器模式是一种结构性模式,它作用是对对象已有功能进行增强,但是不改变原有对象结构。这避免了通过继承方式进行功能扩充导致的类体系臃肿。

9.2 Spring中BeanDefinitionDecorator

先看下类图:

image.png

如图ScopedProxyBeanDefinitionDecorator实现了decorate方法用来对scope作用域为request的bean定义进行包装。 具体时序图为:

image.png

代码语言:javascript
复制
class ScopedProxyBeanDefinitionDecorator implements BeanDefinitionDecorator {

    private static final String PROXY_TARGET_CLASS = "proxy-target-class";


    @Override
    public BeanDefinitionHolder decorate(Node node, BeanDefinitionHolder definition, ParserContext parserContext) {
        boolean proxyTargetClass = true;
        if (node instanceof Element) {
            Element ele = (Element) node;
            if (ele.hasAttribute(PROXY_TARGET_CLASS)) {
                proxyTargetClass = Boolean.valueOf(ele.getAttribute(PROXY_TARGET_CLASS));
            }
        }

        // 创建scoped的代理类,并注册到容器
        BeanDefinitionHolder holder =
                ScopedProxyUtils.createScopedProxy(definition, parserContext.getRegistry(), proxyTargetClass);
        String targetBeanName = ScopedProxyUtils.getTargetBeanName(definition.getBeanName());
        parserContext.getReaderContext().fireComponentRegistered(
                new BeanComponentDefinition(definition.getBeanDefinition(), targetBeanName));
        return holder;
    }

}

关于ScopedProxyBeanDefinitionDecorator干啥用的那:

代码语言:javascript
复制
  <bean id="lavaPvgInfo" class="com.alibaba.lava.privilege.PrivilegeInfo"
        scope="request">
        <property name="aesKey" value="666" />
        <aop:scoped-proxy />
    </bean>

其实就是处理<aop:scoped-proxy /> 的,具体作用是包装lavaPvgInfo的bean定义为ScopedProxyFactoryBean,作用是实现request作用域bean.

9.3 commons-collections包中ListUtils

image.png

如图

ListUtils中的四个方法分别依赖list的四种装饰器类对List功能进行扩充和限制。 其中FixedSizeList类通过禁止add/remove操作保证list的大小固定,但是可以修改元素内容 其中UnmodifiableList类通过禁用add,clear,remove,set,保证list的内容不被修改 其中SynchronizedList类通过使用Lock 来保证add,set,get,remove等的同步安全 其中LazyList类则当调用get方法发现list里面不存在对象时候,自动使用factory创建对象.

9.4 使用场景

  • 在不改变原有类结构基础上,新增或者限制或者改造功能时候。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.05.25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 九、装饰器模式(Decorator Pattern)
    • 9.1 介绍
      • 9.2 Spring中BeanDefinitionDecorator
        • 9.3 commons-collections包中ListUtils
          • 9.4 使用场景
          相关产品与服务
          容器服务
          腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档