目录
Java Servlet中的HttpServletRequestWrapper
Java的InputStream、Reader、OutputStream、Writer家族
what什么是装饰模式
Gof定义:动态地给一个对象添加一些额外的职责。就增加功能来说, Decorator模式相比生成子类更为灵活。别名Wrapper。
HeadFirst定义:动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方法。
这里很重要的一点是是比继承更有弹性,根据翻译的不同,装饰模式也有人称之为“油漆工模式”。
why为什么需要装饰模式
首先介绍一下常见的给一个类或者对象增加行爲的方式:
- 继承,使用继承机制是给现有类添加功能的一种有效途径,通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法。但是这种方法是静态的,用户不能控制增加行为的方式和时机。
- 关联,即将一个类的对象A嵌入另一个对B象中,由另一个对象B来决定是否调用嵌入对象A的行为以便扩展自己的行为。
有时候我们希望给某个对象而不是类添加功能,例如一个图形用户界面工具箱允许你对任意的用户界面添加特性,比如窗口滑动。使用继承是一种方法,但是这种方法不够灵活,因为边框的选择是静态的,用户不能控制对组件加边框的时间和方法。
比较灵活的方式是将组件嵌入到另一个对象中,由这个对象添加边框。我们称之为装饰。这个装饰与它所装饰的组件接口一模一样,因此对使用该组件的客户透明。在请求转发给这个组件的时候,可以在转发前执行一些额外的动作,比如画一个边框,透明性的使用可以递归的嵌套多个装饰,从而添加任意多的功能,如下图。
how如何实现装饰者模式
装饰器模式主要包含以下角色。
- 抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。
- 具体构件(ConcreteComponent)角色:实现抽象构件,通过装饰角色为其添加一些职责。
- 抽象装饰(Decorator)角色:继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。
- 具体装饰(ConcreteDecorator)角色:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。
开源框架经典案例
相比其他设计模式,装饰者模式是十分普遍的设计模式,几乎各个开源框架,中间件都是会使用该模式,下面举几个常见的例子.
Java Servlet中的HttpServletRequestWrapper
Java Servlet中有个类叫HttpServletRequestWrapper,这个类包装了ServletRequest,可以做一个功能的增强,通过类的描述也可以看到,方法模式是调用HttpServletRequest请求,但是我们可以继续包装这个类进行功能的增强。
/**
* Provides a convenient implementation of the HttpServletR