10.1 装饰器(Decorator)模式
10.1 装饰器模式
装饰器模式
装饰器模式,顾名思义,就是对已经存在的某些类进行装饰,以此来扩展一些功能
即使你没有该对象的源代码或者该对象标识为final
。Decorator
模式适用于无法继承该类
(例如,对象的实现类使用final
标识)或者无法创建该类的实例
,但从另外的系统中可以取得该类的实现的情况
。例如,Servlet
容器方法。只有一种方法可以修改ServletRequest
或者ServletResponse
行为,即在另外的对象中封装该实例。
唯一的限制是,修饰对象必须继承一个接口,然后实现接口以封装这些方法。
Decorator模式的URL类图
UML
类图如下图所示。
图中的类图说明了一个Component
接口以及它的实现类ComponentImpl
。Component
接口定义了名为A
的方法。为了修饰ComponentImpl
的实例,需要创建一个Decorator
类,并实现Component
接口,然后在子类中扩展Decorator
的新行为。在类图中DecoratorA
就是Decorator
的一个子类。每个Decorator
实例需要包含Component
的一个实例。Decorator
类代码如下(注意在构造函数中获取了Component
的实例,这意味着创建Decorator
对象只能传入Component
的实例):
实例
Decorator.java
1 | //实现Component,以修饰Component |
在Decorator
类中,有修饰的方法就是可能在子类中需要修改行为的方法,在子类中不需要修饰的方法可以不需要实现。所有的方法,无论是否需要修饰,都叫作Component
中的配对方法。Decorator
是一个非常简单的类,便于提供每个方法的默认实现。修改行为在它的子类中。
需要牢记一点,**Decorator
类及被修饰对象的类需要实现相同的接口。为了实现Decorator
,可以在Decorator
中封装修饰对象,并把Decorator
作为Component
的一个实现**。任何Component
的实现都可以在Decorator
中注入。事实上,你可以把一个修饰的对象传入另一个修饰的对象,以实现双重的修饰。