装饰者(Decorator)模式:动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更具有弹性的替代方案。对于装饰者模式,它其实是一种包装,所以我更愿意称它为一种包装。像咱们以前经常使用的Java里面的IO流就用到了装饰者模式。比如:BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file1)));这里file1为目标对象,而像BufferedReader、InputStreamReader就可以称之为包装类。下面举例说明:
## 一、UML模型图
![](https://box.kancloud.cn/2016-02-19_56c7196d143cb.jpg)
## 二、代码实现
~~~
/**
* 对修改关闭,对扩展开放。
*
* 统一接口
*/
interface Filterable {
public void filter();
}
/**
* 目标类
*/
class Filter implements Filterable {
@Override
public void filter() {
System.out.println("目标类的核心过滤方法...");
}
}
/**
* DecoratorForFilter1包装类与目标类实现相同的接口 --> 织入Log
*/
class DecoratorForFilter1 implements Filterable {
private Filterable filterable;
public DecoratorForFilter1(Filterable filterable) {
this.filterable = filterable;
}
private void beforeMethod() {
System.out.println("DecoratorForFilter1 --> 核心过滤方法执行前执行");
}
private void afterMethod() {
System.out.println("DecoratorForFilter1 --> 核心过滤方法执行后执行");
}
@Override
public void filter() {
beforeMethod();
filterable.filter();
afterMethod();
}
}
/**
* DecoratorForFilter2包装类与目标类实现相同的接口 --> 织入Log
*/
class DecoratorForFilter2 implements Filterable {
private Filterable filterable;
public DecoratorForFilter2(Filterable filterable) {
this.filterable = filterable;
}
private void beforeMethod() {
System.out.println("DecoratorForFilter2 --> 核心过滤方法执行前执行");
}
private void afterMethod() {
System.out.println("DecoratorForFilter2 --> 核心过滤方法执行后执行");
}
@Override
public void filter() {
beforeMethod();
filterable.filter();
afterMethod();
}
}
/**
* 客户端测试类
*
* @author Leo
*/
public class Test {
public static void main(String[] args) {
/**
* 目标对象
*/
Filterable targetObj = new Filter();
/**
* 包装对象(对目标对象进行包装)
*/
Filterable decorObj = new DecoratorForFilter1(new DecoratorForFilter2(
targetObj));
/**
* 执行包装后的业务方法
*/
decorObj.filter();
}
}
~~~
输出:
DecoratorForFilter1 --> 核心过滤方法执行前执行
DecoratorForFilter2 --> 核心过滤方法执行前执行
目标类的核心过滤方法...
DecoratorForFilter2 --> 核心过滤方法执行后执行
DecoratorForFilter1 --> 核心过滤方法执行后执行
## 三、应用场景(仅代表个人观点)
I/O、过滤器
## 四、小结
通过输入的Log我们可以看到:输出的过程其实是将包装类“拆包”的过程,就像包装袋一样一层一层的拆开。
设计原则:1)多用组合,少用继承。2)对扩展开放,对修改关闭。
- 前言
- (一)策略模式建模与实现
- (二)观察者模式建模与实现
- (三)装饰者模式建模与实现
- (四)工厂方法模式建模与实现
- (五)抽象工厂模式建模与实现
- (六)单例模式建模与实现
- (七)命令模式建模与实现
- (八)适配器模式建模与实现
- (九)外观模式建模与实现
- (十)模板方法模式建模与实现
- (十一)迭代器模式建模与实现
- (十二)组合模式建模与实现
- (十三)状态模式建模与实现
- (十四)代理模式建模与实现
- (十五)建造者模式建模与实现
- (十六)原型模式建模与实现
- (十七)桥接模式建模与实现
- (十八)责任链模式建模与实现
- (十九)备忘录模式建模与实现
- (二十)解释器模式建模与实现
- (二十一)享元模式建模与实现
- (二十二)中介者模式建模与实现
- (二十三)访问者模式建模与实现
- Java设计模式博客全目录