装饰器模式的核心就是”组合优于继承”,但是不同的是
    装饰器类和原始类继承同样的父类,这样我们可以对原始类“嵌套”多个装饰器类
    装饰器类是对功能的增强,这也是装饰器模式应用场景的一个重要特点实际上,符合“组合关系”这种代码结构的设计模式有很多,比如之前讲过的代理模式、桥接模式,还有现在的装饰器模式。尽管它们的代码结构很相似,但是每种设计模式的意图是不同的。就拿比较相似的代理模式和装饰器模式来说吧,代理模式中,代理类附加的是跟原始类无关的功能,而在装饰器模式中,装饰器类附加的是跟原始类相关的增强功能。

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

    装饰器模式主要解决继承关系过于复杂的问题,通过组合来替代继承。它主要的作用是给原始类添加增强功能。这也是判断是否该用装饰器模式的一个重要的依据。除此之外,装饰器模式还有一个特点,那就是可以对原始类嵌套使用多个装饰器。为了满足这个应用场景,在设计的时候,装饰器类需要跟原始类继承相同的抽象类或者接口。