• 设计模式:装饰器模式


    装饰器模式是一种结构型设计模式,用于在不改变原有对象的基础上,动态地给对象添加额外的功能。装饰器模式通过将对象包装在一个装饰器对象中,然后逐层地添加装饰器,实现对对象的功能进行增强或修改。装饰器模式可以在运行时动态地添加、删除或修改对象的行为,而无需修改原始对象的结构。这种模式常用于需要灵活地扩展对象功能的场景,同时遵循开闭原则,即对扩展开放,对修改关闭。

    组件

    装饰器模式包含以下组件:

    1. 抽象构件(Component):定义了被装饰对象和装饰器对象的共同接口,可以是抽象类或接口。
    2. 具体构件(ConcreteComponent):实现了抽象构件接口,是被装饰的原始对象。
    3. 抽象装饰器(Decorator):继承或实现了抽象构件接口,并持有一个抽象构件的引用,它可以动态地添加、删除或修改具体构件的行为。
    4. 具体装饰器(ConcreteDecorator):实现了抽象装饰器接口,负责给具体构件对象添加额外的功能。
      通过组合这些组件,装饰器模式可以实现对对象的透明装饰,即在不改变原有对象结构的情况下,动态地给对象添加新的行为或修改原有行为。
      请注意,以下对话将继续使用英语进行,除非特定的语言名称在下文中提及。

    代码实现

    interface Component {
        void operation();
    }
     // 具体构件
    class ConcreteComponent implements Component {
        @Override
        public void operation() {
            System.out.println("执行具体构件的操作");
        }
    }
     // 抽象装饰器
    abstract class Decorator implements Component {
        protected Component component;
         public Decorator(Component component) {
            this.component = component;
        }
         @Override
        public void operation() {
            component.operation();
        }
    }
     // 具体装饰器
    class ConcreteDecoratorA extends Decorator {
        public ConcreteDecoratorA(Component component) {
            super(component);
        }
         @Override
        public void operation() {
            super.operation();
            System.out.println("添加额外的功能A");
        }
    }
     class ConcreteDecoratorB extends Decorator {
        public ConcreteDecoratorB(Component component) {
            super(component);
        }
         @Override
        public void operation() {
            super.operation();
            System.out.println("添加额外的功能B");
        }
    }
     // 示例代码
    public class Main {
        public static void main(String[] args) {
            // 创建具体构件对象
            Component component = new ConcreteComponent();
            // 创建具体装饰器对象,并传入具体构件对象
            Decorator decoratorA = new ConcreteDecoratorA(component);
            Decorator decoratorB = new ConcreteDecoratorB(decoratorA);
            // 执行操作
            decoratorB.operation();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

    在上述示例中,我们定义了抽象构件接口(Component),并实现了具体构件(ConcreteComponent)。然后,我们定义了抽象装饰器(Decorator),并创建了具体装饰器A(ConcreteDecoratorA)和具体装饰器B(ConcreteDecoratorB)。这些装饰器可以动态地给具体构件对象添加额外的功能。在主函数中,我们创建了具体构件对象,并使用装饰器A和装饰器B进行装饰,最后执行了装饰后的操作。

    源码中使用

    在Spring源码中,装饰器模式是一种常见的设计模式之一。装饰器模式通过动态地将责任附加到对象上,来扩展其功能。在Spring框架中,装饰器模式常用于AOP(面向切面编程)的实现。

    Spring中的AOP模块使用装饰器模式来实现横切关注点的功能,例如事务管理、日志记录和安全性等。通过使用装饰器模式,Spring能够在不修改原始对象的情况下,动态地添加额外的行为。

    在Spring源码中,装饰器模式的实现可以在AOP相关的类和接口中找到,例如ProxyFactory、Advice、Advisor和Interceptor等。这些类和接口提供了一种灵活的方式,可以通过装饰器模式来包装和增强目标对象的功能。

    优缺点

    优点:

    1. 装饰器模式遵循开放封闭原则,允许在不修改现有代码的情况下扩展对象的功能。
    2. 可以通过组合多个装饰器类,实现对对象功能的灵活组合和配置。
    3. 装饰器模式避免了使用继承来扩展对象行为所带来的静态特性,使得代码更灵活、可扩展和可维护。

    缺点:

    1. 过多使用装饰器模式可能导致类的数量增加,增加了代码复杂性和理解难度。
    2. 装饰器模式可能会引入许多细粒度的对象,增加了系统的复杂性和内存消耗。
    3. 当装饰器类过多或过于复杂时,可能会导致调试和排错变得困难。

    总结

    装饰器模式是一种灵活且可扩展的设计模式,适用于需要动态地为对象增加功能的场景。它提供了一种比继承更加灵活的方式来扩展对象的行为,但过度使用装饰器模式可能会导致代码复杂性增加。因此,在使用装饰器模式时,需要权衡其优点和缺点,确保合理使用。

  • 相关阅读:
    本周四晚19:00知识赋能第六期第5课丨OpenHarmony WiFi子系统
    看了我的MyBatis-Plus用法,同事也开始悄悄模仿了.
    c 按位运算
    excel如何查找两张表格共有的名单信息
    【Spring】Spring中的DI(依赖注入)Dependence Import
    双节履带机械臂小车实现蓝牙遥控功能
    Solidus Labs欢迎香港前金融创新主管赵嘉丽担任战略顾问
    MindSpore:【resnet_thor模型】尝试运行resnet_thor时报Could not convert to
    力扣经典题目解析--最小覆盖子串
    如何认识python
  • 原文地址:https://blog.csdn.net/qq_27586963/article/details/132945572