装饰器模式
前言
我们之前谈到代理模式可以用来增强与业务无关的功能,装饰器呢则可以解决与业务相关的功能增强问题。其解决的思路就是:组合。当然也是可以通过继承来解决的,但是继承可能会导致因装饰的功能过多而造成继承链爆炸的问题,维护困难。绝大多数情况之下组合还是优于继承的(箴言)
正文
装饰器模式的另外一个特征:为了解决多重装饰的问题。装饰类和原始类都继承自同一抽象父类或者接口。
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 | } |
小结
因为装饰器模式主要解决业务增强的问题,所以在日常业务代码的开发过程当中还是挺常用的,可以方便扩展和服用原有代码。主要还是要理解组合优于继承的思想。