当前位置: 首页 > article >正文

结构型模式-装饰器模式

装饰者模式(Decorator Pattern)是一种结构型设计模式,主要用于动态地给对象添加一些额外的职责,而无需修改其代码。通过将对象放入包含行为的装饰器对象中,能够有效地扩展功能,同时保持原始类的结构和代码完整性。

装饰者模式的核心要点

  • 开放/封闭原则:在不修改原始类代码的情况下扩展功能。
  • 动态扩展:相比继承,装饰者模式更灵活,可以在运行时选择装饰器来增强对象功能。
  • 面向接口:装饰者和被装饰对象共享一个公共的接口。

结构

  • 组件(Component):定义一个抽象接口,供具体的组件和装饰器实现。
  • 具体组件(ConcreteComponent):实现组件接口,是被装饰的原始对象。
  • 装饰器(Decorator):实现组件接口,并包含一个对组件对象的引用,用于在其基础上增强功能。
  • 具体装饰器(ConcreteDecorator):扩展装饰器功能,提供具体的附加行为。

Java实现示例

//抽象组件接口:
public interface Component {
    void operation();
}
//具体组件
public class ConcreteComponent implements Component {
    @Override
    public void operation() {
        System.out.println("基础操作");
    }
}
//抽象装饰器
public abstract class Decorator implements Component {
    protected Component component;

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

    @Override
    public void operation() {
        component.operation();
    }
}
//具体装饰器A和B
public class ConcreteDecoratorA extends Decorator {
    public ConcreteDecoratorA(Component component) {
        super(component);
    }

    @Override
    public void operation() {
        super.operation();
        System.out.println("装饰器A的增强操作");
    }
}

public 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();

        // 使用装饰器A增强
        Component decoratorA = new ConcreteDecoratorA(component);

        // 使用装饰器B增强
        Component decoratorB = new ConcreteDecoratorB(decoratorA);

        // 执行最终操作
        decoratorB.operation();
    }
}

适用场景

  • 需要动态扩展一个类的功能。
  • 不希望通过继承增加类的数量。
  • 需要以不同组合方式增强对象的功能。

相比继承,装饰者模式更灵活,适合功能扩展需求频繁变动的场景,比如日志记录、权限校验等功能的实现。


http://www.kler.cn/a/414038.html

相关文章:

  • STL算法之基本算法<stl_algobase.h>
  • Eclipse 创建 Java 接口
  • spring boot3.3.5 logback-spring.xml 配置
  • c++趣味编程玩转物联网:基于树莓派Pico控制有源蜂鸣器
  • 七牛云AIGC内容安全方案助力企业合规创新
  • VsCode 插件推荐(个人常用)
  • reactivex.Observable 超时问题
  • 探索 Spring 框架核心组件:构建强大 Java 应用的基石
  • 算法日记 35 day 动态规划
  • QINQ技术
  • 使用Hugo和GitHub Pages创建静态网站个人博客
  • 学习threejs,使用CubeCamera相机创建反光效果
  • git merge 排除文件
  • flutter开发环境—Windows
  • 【Ant Design Vue】表单校验 rules 不起作用
  • JVM_栈详解一
  • java——谈谈对Spring的Bean理解
  • vue3,form表单如何为遍历生成的form-item设置ref属性以及滚动定位
  • Diving into the STM32 HAL----- Real-Time Clock笔记
  • websocket前后端长连接之java部分
  • Apache SSI 远程命令执行漏洞
  • JVM知识点学习-1
  • 【Java从入门到放弃 之 条件判断与循环】
  • openjdk17 jvm byte数组 内存溢出 在C++源码体现
  • 使用TensorRT LLM的量化实践
  • BASLER工业相机维修不能触发拍照如何处理解决这个问题