定义

装饰器模式又名包装(Wrapper)模式。装饰器模式以对客户端透明的方式拓展对象的功能,是继承关系的一种替代方案。

应用场景

  • 需要大量的子类为某一个对象进行职责增强的时候,可以使用装饰器模式
  • 希望使用继承对于类进行动态扩展的时候,可以考虑使用装饰器模式

装饰器模式的优点

  • 装饰类的公用类不再需要设置抽象的方法,使得装饰实现子类也不在依赖抽象父类的抽象方法
  • 既然装饰者和被装饰对象有相同的超类型,所以在任何需要原始对象(被包装的)的场合,就可以用装饰过的对象代替它。
  • 装饰类和被装饰类的扩展和实现都是解耦的,不需要互相关注实现细节,装饰子类可以独自实现方法

装饰器模式的缺点

  • 本质上还是继承结构,而且装饰类和被装饰类必须有相同的顶级父类接口
  • 装饰类在系统越来越复杂之后会出现明显的膨胀。
  • 装饰者很容易出现大量的小类,这让了解代码的人不容易清楚不同装饰的设计
  • 装饰者互相嵌套可能会增加代码的复杂度,也增加扩展装饰者子类的复杂度,最终这个难题会变成调用者的难题

装饰器模式示例代码

抽象构件(Component)角色:所有被装饰组件及装饰器对应的接口标准,指定进行装饰的行为方法。

示例:

1
2
3
public interface Component {
public void sampleOpreation();
}

具体构件(ConcreteComponent)角色:需要被装饰的组件,实现组件接口标准,只具备自身未被装饰的原始特性。

示例:

1
2
3
4
5
6
public class ConcreteComponent implements Component {
@Override
public void sampleOpreation() {
// TODO 完成相关的业务代码
}
}

装饰(Decorator)角色:装饰器的高层抽象类,同样实现组件接口标准,且包含一个被装饰的组件。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Decorator implements Component {
private Component component;

public Decorator(Component component) {
this.component = component;
}

@Override
public void sampleOpreation() {
//委派给构件
component.sampleOpreation();
}

}

具体装饰(ConcreteDecorator)角色:继承自装饰器抽象类的具体子类装饰器,可以有多种实现,在被装饰组件对象的基础上为其添加新的特性。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class ConcreteDecoratorA extends Decorator {
public ConcreteDecoratorA(Component component) {
super(component);
}

@Override
public void sampleOpreation() {
super.sampleOpreation();
//TODO 完成相关的业务代码
}
}

public class ConcreteDecoratorB extends Decorator {
public ConcreteDecoratorB(Component component) {
super(component);
}

@Override
public void sampleOpreation() {
super.sampleOpreation();
//TODO 完成相关的业务代码
}
}

客户端代码示例:

1
2
3
4
5
6
public class Client{
public static void main(String[] args){
Component component = new ConcreteDecoratorA(new ConcreteDecoratorB(new ConcreteComponent));
component.sampleOpreation();
}
}

实际案例网上很多,在此不赘述…