什么是装饰器模式(Decorator)
- 动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式相比生成子类更为灵活。
装饰器模式的优点
- 装饰类和被装饰类可以独立发展,而不会互相耦合。
- 装饰模式是继承关系的一个替代方案
- 装饰模式可以动态地扩展一个实现类的功能
装饰器模式的缺点
- 多层的装饰比较复杂
示例代码
package com.pattern.decorator;
/**
* 抽象类,装饰器的父类
* @author yjzhou
*/
public abstract class Decorator implements Component{
private Component component;
public Decorator(Component component) {
this.component = component;
}
@Override
public Integer sum(int num) {
return component.sum(num);
}
}
package com.pattern.decorator;
/**
* 组件接口,所有的组件都要实现这个接口
* @author yjzhou
*/
public interface Component {
/**
* 组件的操作方法
*/
public Integer sum(final int num);
}
package com.pattern.decorator;
/**
* 具体的组件,也是将要被装饰的类
* @author yjzhou
*/
public class ConcreteComponent implements Component{
@Override
public Integer sum(final int num) {
int result = 0;
for(int i=0;i<num;i++){
result += i;
}
return result;
}
}
package com.pattern.decorator;
/**
* 装饰模式
* 具体的装饰类
* @author yjzhou
*/
public class ConcreteDecorator extends Decorator{
public ConcreteDecorator(Component component) {
super(component);
}
private int filterNum(final int num){
int ret = 1;
for (int i=1;i<num;i++){
ret *= i;
}
return ret;
}
/**
* 除了原先的sum()方法外,增加filterNum()方法的额外功能
*/
@Override
public Integer sum(int num) {
System.out.println(this.filterNum(num));
return super.sum(num);
}
}