10.1 装饰器(Decorator)模式

10.1 装饰器模式

装饰器模式

装饰器模式,顾名思义,就是对已经存在的某些类进行装饰,以此来扩展一些功能

即使你没有该对象的源代码或者该对象标识为final
Decorator模式适用于无法继承该类(例如,对象的实现类使用final标识)或者无法创建该类的实例但从另外的系统中可以取得该类的实现的情况。例如,Servlet容器方法。只有一种方法可以修改ServletRequest或者ServletResponse行为,即在另外的对象中封装该实例。
唯一的限制是,
修饰对象必须继承一个接口
,然后实现接口以封装这些方法。

Decorator模式的URL类图

UML类图如下图所示。
这里有一张图片
图中的类图说明了一个Component接口以及它的实现类ComponentImplComponent接口定义了名为A的方法。为了修饰ComponentImpl的实例,需要创建一个Decorator类,并实现Component接口,然后在子类中扩展Decorator的新行为。在类图中DecoratorA就是Decorator的一个子类。每个Decorator实例需要包含Component的一个实例Decorator类代码如下(注意在构造函数中获取了Component的实例,这意味着创建Decorator对象只能传入Component的实例):

实例

Decorator.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//实现Component,以修饰Component
public class Decorator implements Component {
//声明一个Component实例的引用
private Component decorated;
// 构造函数中传入Component的实例
public Decorator(Component component) {
this.decorated = component;
}
//装饰原有的methodA方法,拓展功能
@Override
public void methodA(args) {
//做一些其他的工作
decorated.methodA(args);
//做一些其他的工作
}
//装饰原有的methodA方法,拓展功能
@Override
public void methodB(args) {
//做一些其他的工作
decorated.methodB(args)
//做一些其他的工作
}
}

Decorator类中,有修饰的方法就是可能在子类中需要修改行为的方法,在子类中不需要修饰的方法可以不需要实现。所有的方法,无论是否需要修饰,都叫作Component中的配对方法。Decorator是一个非常简单的类,便于提供每个方法的默认实现。修改行为在它的子类中。
需要牢记一点,**Decorator类及被修饰对象的类需要实现相同的接口为了实现Decorator,可以在Decorator中封装修饰对象,并把Decorator作为Component的一个实现**。任何Component的实现都可以在Decorator中注入。事实上,你可以把一个修饰的对象传入另一个修饰的对象,以实现双重的修饰。

参考资料

https://www.cnblogs.com/jzb-blog/p/6717349.html