1. 设计模式-装饰器模式

装饰器模式(Decorator Pattern)是一种结构型设计模式,它动态地给一个对象添加一些额外的职责,就增加功能来说,装饰器模式相比生成子类更为灵活。这种模式创建了一个装饰类,用来包装原有的类,并在保持原有类方法签名完整性的基础上,提供了额外的功能。

2. 抽象组件 (`Component`)

定义一个接口或抽象类,声明了所有装饰器和被装饰对象共有的操作。

public interface Component {
    void operation();
}

3. 具体组件 (`ConcreteComponent`)

实现了 Component 接口的实体类,即需要被装饰的基本对象。

public class ConcreteComponent implements Component {
    @Override
    public void operation() {
        System.out.println("ConcreteComponent Operation");
    }
}

4. 抽象装饰器 (`Decorator`)

继承自 Component,并包含一个对 Component 的引用,用于存储被装饰的对象。

public class Decorator implements Component {
    protected Component component;

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

    @Override
    public void operation() {
        component.operation();
    }
}

5. 具体装饰器 (`ConcreteDecoratorA` 和 `ConcreteDecoratorB`)

具体装饰器类,负责给 Component 添加额外的行为。

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

    @Override
    public void operation() {
        super.operation();
        addedBehaviorA();
    }

    private void addedBehaviorA() {
        System.out.println("ConcreteDecoratorA Added Behavior");
    }
}

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

    @Override
    public void operation() {
        super.operation();
        addedBehaviorB();
    }

    private void addedBehaviorB() {
        System.out.println("ConcreteDecoratorB Added Behavior");
    }
}

6. 使用示例

public class Main {
    public static void main(String[] args) {
        Component component = new ConcreteComponent();
        Component decoratorA = new ConcreteDecoratorA(component);
        Component decoratorAB = new ConcreteDecoratorB(decoratorA);

        decoratorAB.operation();
    }
}

装饰器模式为对象提供了灵活的扩展机制,特别适合在不影响已有代码结构的基础上,为对象添加新的功能或行为。它强调了面向对象设计的“组合优于继承”的原则,但在使用时需要注意控制装饰器的层数,避免过度装饰导致的结构复杂化。装饰器模式是处理系统中职责变化较为频繁部分的一种优雅方式,但需权衡其带来的内存开销与系统复杂度的提升。

7. 优点

  1. 灵活性高:可以在运行时动态地给对象添加功能,无需修改原有对象的结构。
  2. 遵循开放封闭原则:对扩展开放(新增装饰器),对修改封闭(不改变组件接口和实现)。
  3. 简化对象的创建过程:通过组合而非继承来扩展功能,避免了类爆炸问题。

8. 缺点

  1. 装饰器使用不当可能造成对象结构复杂:过度装饰会导致对象层级过深,难以理解与维护。
  2. 装饰模式比直接使用继承更消耗内存:因为每个装饰对象都需要单独实例化,增加了对象的数量。