1. 设计模式之装饰器模式:对目标类的功能进行增强

1.1. 介绍

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

动态地给一个对象添加额外的职责,同时不改变其结构。装饰器模式提供了一种灵活的替代继承方式来扩展功能。

装饰器模式 vs 代理模式

对比维度 装饰器模式(Decorator) 代理模式(Proxy)
设计目的 动态扩展功能(增强原有行为)。 控制访问(保护或隐藏真实对象)。
关注点 添加新职责(如加糖、加密)。 管理对象生命周期(如延迟加载、权限校验)。
调用关系 装饰器和被装饰对象实现相同接口,客户端直接操作装饰器。 代理类和真实类实现相同接口,客户端通过代理间接访问真实对象。
对象创建时机 装饰器显式接收被装饰对象(外部传入)。 代理类内部创建或管理真实对象。
典型应用 Java I/O流、GUI组件增强。 远程代理、虚拟代理、安全代理。
关键点 装饰器透明增强功能,客户端知道原类及增强类 代理 隐藏 真实对象,客户端通过代理间接操作

应用场景

  1. 动态扩展对象功能:如Java I/O流(BufferedInputStreamDataInputStream等)。

  2. 避免子类爆炸:替代多层继承(如咖啡加料、文件加密压缩)。

  3. 运行时添加或移除功能:如GUI组件的边框、滚动条等动态装饰。

优缺点及建议

优点
1.灵活扩展功能,无需修改原有代码。
2.符合开闭原则(OCP)。
3.组合优于继承,减少类爆炸。

缺点
1.多层装饰可能导致代码复杂(如`new A(new B(new C()))`)。
2.设计时需要区分核心功能和装饰功能。

使用建议
1.当需要在不增加大量子类的情况下扩展类的功能。
2.当需要动态地添加或撤销对象的功能。

注意事项
1.优先使用接口定义`Component`。  
2.装饰器类命名以`Decorator`结尾(如`MilkDecorator`)。  
3.避免过度装饰(一般不超过3层)。

1.2. 实现及相关代码

假设有一个业务,增强某组件的功能。

1.2.1. 相关代码

接口及数据对象

public interface Component {
    void execute();
}

public static class ConcreteComponent implements Component {
    public void execute() {
        System.out.println("执行基础功能");
    }
}

public static class Decorator implements Component {
    private Component component;

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

    public void execute() {
        System.out.println("在执行基础功能之前,执行部分功能增强");
        component.execute();
        System.out.println("在执行基础功能之后,执行部分功能增强");
    }
}

调用方法

public static void main(String[] args) {
    Component decorator = new Decorator(new ConcreteComponent());
    decorator.execute();
}

results matching ""

    No results matching ""