装饰器模式

装饰器模式

前言

我们之前谈到代理模式可以用来增强与业务无关的功能,装饰器呢则可以解决与业务相关的功能增强问题。其解决的思路就是:组合。当然也是可以通过继承来解决的,但是继承可能会导致因装饰的功能过多而造成继承链爆炸的问题,维护困难。绝大多数情况之下组合还是优于继承的(箴言)

正文

装饰器模式的另外一个特征:为了解决多重装饰的问题。装饰类和原始类都继承自同一抽象父类或者接口。

Java I/O中类纷繁复杂,大多都是使用装饰器模式进行设计的以达到复用和扩展。有兴趣的朋友可以看看源码,加深理解

1
2
// 代理模式的代码结构(下面的接口也可以替换成抽象类)
3
public interface IA {
4
  void f();
5
}
6
public class A impelements IA {
7
  public void f() { //... }
8
}
9
public class AProxy impements IA {
10
  private IA a;
11
  public AProxy(IA a) {
12
    this.a = a;
13
  }
14
  
15
  public void f() {
16
    // 新添加的代理逻辑
17
    a.f();
18
    // 新添加的代理逻辑
19
  }
20
}
21
22
// 装饰器模式的代码结构(下面的接口也可以替换成抽象类)
23
public interface IA {
24
  void f();
25
}
26
public class A impelements IA {
27
  public void f() { //... }
28
}
29
public class ADecorator impements IA {
30
  private IA a;
31
  public ADecorator(IA a) {
32
    this.a = a;
33
  }
34
  
35
  public void f() {
36
    // 功能增强代码
37
    a.f();
38
    // 功能增强代码
39
  }
40
}

小结

因为装饰器模式主要解决业务增强的问题,所以在日常业务代码的开发过程当中还是挺常用的,可以方便扩展和服用原有代码。主要还是要理解组合优于继承的思想。