• 设计模式-装饰器模式


    设计模式-装饰器模式

    什么是装饰器设计模式?

    装饰器设计模式(Decorator Pattern)是一种结构型设计模式,它允许你通过将对象包装在一个装饰器类中来动态地扩展其功能。装饰器模式能够在不改变原有对象的情况下,通过添加新的装饰器类来增加对象的功能。

    在装饰器模式中,有一个抽象组件(Component)接口,定义了被装饰对象和装饰器对象的共同行为。然后有一个具体组件(ConcreteComponent)类,实现了抽象组件接口,并定义了基本的功能。接下来,有一个抽象装饰器(Decorator)类,也实现了抽象组件接口,并持有一个抽象组件对象的引用。最后,有一个具体装饰器(ConcreteDecorator)类,继承自抽象装饰器类,可以在不改变原有对象的情况下,通过添加新的功能来装饰被装饰对象。

    装饰器模式的优点包括:

    • 可以动态地扩展对象的功能,而无需修改原有对象。
    • 可以通过组合多个装饰器来实现不同的功能组合。
    • 可以灵活地添加或移除装饰器,以达到不同的功能需求。

    装饰器模式常见的应用场景包括:

    • 在不改变原有类的情况下,为类添加新的功能。
    • 需要动态地为对象添加额外的行为。
    • 需要在运行时对对象进行功能扩展。

    总之,装饰器模式通过包装对象来实现动态的功能扩展,提供了一种灵活、可扩展的方式来修改对象的行为。

    java示例

    以下是一个简单的Java示例,演示了如何使用装饰器模式来扩展对象的功能:

    首先,我们定义一个抽象组件接口 Component,它包含一个 doSomething() 方法:

    public interface Component {
        void doSomething();
    }
    
    • 1
    • 2
    • 3

    然后,我们创建一个具体组件类 ConcreteComponent,实现了抽象组件接口:

    public class ConcreteComponent implements Component {
        @Override
        public void doSomething() {
            System.out.println("Doing something...");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    接下来,我们定义一个抽象装饰器类 Decorator,它也实现了抽象组件接口,并持有一个抽象组件对象的引用:

    public abstract class Decorator implements Component {
        protected Component component;
    
        public Decorator(Component component) {
            this.component = component;
        }
    
        @Override
        public void doSomething() {
            component.doSomething();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    最后,我们创建一个具体装饰器类 ConcreteDecorator,继承自抽象装饰器类,并在 doSomething() 方法中添加额外的功能:

    public class ConcreteDecorator extends Decorator {
        public ConcreteDecorator(Component component) {
            super(component);
        }
    
        @Override
        public void doSomething() {
            super.doSomething();
            System.out.println("Adding extra functionality...");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    现在,我们可以使用装饰器模式来扩展对象的功能:

    public class Main {
        public static void main(String[] args) {
            // 创建一个具体组件对象
            Component component = new ConcreteComponent();
    
            // 使用具体装饰器来装饰组件对象
            Component decoratedComponent = new ConcreteDecorator(component);
    
            // 调用装饰后的对象的方法
            decoratedComponent.doSomething();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    输出结果为:

    Doing something...
    Adding extra functionality...
    
    • 1
    • 2

    这个例子中,我们首先创建了一个具体组件对象 ConcreteComponent,然后使用具体装饰器 ConcreteDecorator 来装饰该组件对象。最后,调用装饰后的对象的 doSomething() 方法,即可在不改变原有对象的情况下,添加额外的功能。

  • 相关阅读:
    代码案例详解!如何让机器学习模型自解释!⛵
    C++ 中explicit的作用及用法
    线程相关的模型
    超全面试汇总——Hadoop(二)
    Java 基础高频面试题(2022年最新版)
    xunhuan Jacobi method SVD
    6.二叉树.题目3
    极端业务场景下,我们应该如何做好稳定性保障?
    JavaScript进阶(二十九): 走近 es6 之 new.target
    EasyX图形库note4,动画及键盘交互
  • 原文地址:https://blog.csdn.net/wangxinxinsj/article/details/134022218