从开源框架理解设计模式系列#Decorator装饰模式

本文深入解析装饰模式,解释其为何比继承更灵活,介绍何时使用装饰模式,并通过Java Servlet的HttpServletRequestWrapper、InputStream/Reader/OutputStream/Writer家族及Dubbo的Wrapper等案例说明其实现和应用。此外,探讨了装饰模式的优缺点,帮助开发者更好地理解和运用装饰模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

what什么是装饰模式

why为什么需要装饰模式

how如何实现装饰者模式

开源框架经典案例

Java Servlet中的HttpServletRequestWrapper

Java的InputStream、Reader、OutputStream、Writer家族

Dubbo中的Wrapper

使用场景

优缺点对比

优点

缺点

参考资料


what什么是装饰模式

        Gof定义:动态地给一个对象添加一些额外的职责。就增加功能来说, Decorator模式相比生成子类更为灵活。别名Wrapper。
        HeadFirst定义:动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方法。

        这里很重要的一点是是比继承更有弹性,根据翻译的不同,装饰模式也有人称之为“油漆工模式”。

why为什么需要装饰模式

        首先介绍一下常见的给一个类或者对象增加行爲的方式:

  • 继承,使用继承机制是给现有类添加功能的一种有效途径,通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法。但是这种方法是静态的,用户不能控制增加行为的方式和时机。
  • 关联,即将一个类的对象A嵌入另一个对B象中,由另一个对象B来决定是否调用嵌入对象A的行为以便扩展自己的行为。

        有时候我们希望给某个对象而不是添加功能,例如一个图形用户界面工具箱允许你对任意的用户界面添加特性,比如窗口滑动。使用继承是一种方法,但是这种方法不够灵活,因为边框的选择是静态的,用户不能控制对组件加边框的时间和方法。

        比较灵活的方式是将组件嵌入到另一个对象中,由这个对象添加边框。我们称之为装饰。这个装饰与它所装饰的组件接口一模一样,因此对使用该组件的客户透明。在请求转发给这个组件的时候,可以在转发前执行一些额外的动作,比如画一个边框,透明性的使用可以递归的嵌套多个装饰,从而添加任意多的功能,如下图。 

how如何实现装饰者模式

        装饰器模式主要包含以下角色。

  1. 抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。
  2. 具体构件(ConcreteComponent)角色:实现抽象构件,通过装饰角色为其添加一些职责。
  3. 抽象装饰(Decorator)角色:继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。
  4. 具体装饰(ConcreteDecorator)角色:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。

装饰模式的结构图

开源框架经典案例

        相比其他设计模式,装饰者模式是十分普遍的设计模式,几乎各个开源框架,中间件都是会使用该模式,下面举几个常见的例子.

Java Servlet中的HttpServletRequestWrapper

        Java Servlet中有个类叫HttpServletRequestWrapper,这个类包装了ServletRequest,可以做一个功能的增强,通过类的描述也可以看到,方法模式是调用HttpServletRequest请求,但是我们可以继续包装这个类进行功能的增强。


/**
 * Provides a convenient implementation of the HttpServletR
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值