首页 > 其他分享 >深入理解装饰器模式:动态扩展对象功能的利器

深入理解装饰器模式:动态扩展对象功能的利器

时间:2024-09-24 10:53:49浏览次数:10  
标签:器类 Component 扩展 component public 利器 operation 装饰

装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许向一个现有的对象添加新的功能,同时又不改变其结构。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整的前提下,提供额外的功能。

装饰器模式通过创建一个装饰类包装原有的类,从而在不改变原有类的基础上扩展其功能。装饰器类与被装饰类实现相同的接口,这样客户端可以透明地使用装饰器类。

一,装饰器模式的结构

装饰器模式的主要角色包括:

  1. 抽象组件(Component):定义了对象的接口,可以给这些对象动态地添加职责。
  2. 具体组件(ConcreteComponent):实现了抽象组件接口,是被装饰的原始对象。
  3. 装饰器(Decorator):实现了抽象组件接口,并持有一个抽象组件对象的引用。
  4. 具体装饰器(ConcreteDecorator):继承装饰器类,具体实现向组件添加职责。

uml类图:
在这里插入图片描述

二,装饰器模式的实现

下面是一个简单的装饰器模式实现示例,展示了如何通过装饰器类动态地向原始对象添加功能。

// 抽象组件
public interface Component {
    void operation();
}

// 具体组件
public class ConcreteComponent implements Component {
    @Override
    public void operation() {
        System.out.println("ConcreteComponent: Performing operation.");
    }
}

// 装饰器
public abstract class Decorator implements Component {
    protected Component component;

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

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

// 具体装饰器A
public class ConcreteDecoratorA extends Decorator {
    public ConcreteDecoratorA(Component component) {
        super(component);
    }

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

    private void addedBehavior() {
        System.out.println("ConcreteDecoratorA: Adding behavior.");
    }
}

// 具体装饰器B
public class ConcreteDecoratorB extends Decorator {
    public ConcreteDecoratorB(Component component) {
        super(component);
    }

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

    private void addedBehavior() {
        System.out.println("ConcreteDecoratorB: Adding another behavior.");
    }
}

// 客户端
public class Client {
    public static void main(String[] args) {
        Component component = new ConcreteComponent();
        Component decoratorA = new ConcreteDecoratorA(component);
        Component decoratorB = new ConcreteDecoratorB(decoratorA);
        decoratorB.operation();
    }
}

在这个示例中,Component 是抽象组件接口,ConcreteComponent 是具体组件类,Decorator 是装饰器类,ConcreteDecoratorA 和 ConcreteDecoratorB 是具体装饰器类。客户端通过装饰器类来动态地向原始对象添加功能。

三,装饰器模式的优点

  1. 灵活性高: 装饰器模式允许在运行时动态地添加和删除功能,而不影响其他对象。
  2. 职责分离: 可以将不同的功能分散到不同的装饰器类中,符合单一职责原则。
  3. 可扩展性强: 通过组合不同的装饰器类,可以实现多种功能的叠加。

四,装饰器模式的缺点

  1. 复杂性增加: 由于使用了多个装饰器类,系统的复杂性和理解难度会有所增加。
  2. 调试困难: 由于功能是动态添加的,调试时需要注意装饰器的顺序和组合方式。

五,装饰器模式的应用场景

  1. 图形界面: 在图形界面中,装饰器模式常用于为组件添加滚动条、边框等功能。
  2. 输入输出流: 在Java的IO库中,装饰器模式被广泛用于为输入输出流添加缓冲、数据转换等功能。
  3. 日志记录: 可以使用装饰器模式为日志记录系统添加不同的日志格式或输出方式。

六,结语

装饰器模式通过创建装饰类来动态地向原始对象添加功能,提供了一种灵活、可扩展的方式来增强对象的功能。理解和应用装饰器模式,可以帮助开发者设计出更灵活、更易扩展的系统。


如果你对设计模式、软件架构、编程技巧等内容感兴趣,欢迎关注我们的同名微信公众号【技术拾光者】。在这里,我们将定期分享最新的技术文章和实用的编程技巧,帮助你不断提升自己的技术水平。

扫描下方二维码,立即关注我们吧!
技术拾光者

感谢你的阅读和支持,我们期待与你在微信公众号上交流更多有趣的技术话题!

标签:器类,Component,扩展,component,public,利器,operation,装饰
From: https://blog.csdn.net/weixin_43319056/article/details/142450079

相关文章

  • 【解密 Kotlin 扩展函数】扩展函数的底层原理(十八)
    导读大纲1.1.1从Java调用扩展函数1.1.2扩展函数无法重载1.1.1从Java调用扩展函数在编译器底层下,扩展函数是一种静态方法,它接受接收器对象作为第一个参数调用它不涉及创建适配器对象或任何其他运行时开销这使得从Java使用扩展函数变得非常简单调用静态......
  • 优化商业运营利器!SAP BI助您实现高效决策
    在当今竞争激烈的商业环境中,企业面临着大量复杂的数据和信息流。为了在这样的洪流中立于不败之地,优化商业运营显得尤为重要。SAPBI(BusinessIntelligence,商业智能)作为一款强大的数据分析和决策支持工具,帮助企业高效整合资源,实现科学决策。通过深入分析销售、生产、客户等各方面的......
  • Python装饰器(不带参/带参)
    普通装饰器示例普通装饰器通常用于在不修改函数签名的情况下增强函数功能。#定义一个普通装饰器defmy_decorator(func):defwrapper():print("Somethingishappeningbeforethefunctioniscalled.")func()print("Somethingishappenin......
  • Python 装饰器:强大的代码增强工具
    在Python中,装饰器是一种非常强大的工具,它可以在不修改原有代码的情况下,为函数、方法或类添加额外的功能。本文将深入探讨Python装饰器的高级用法,展示其在不同场景下的灵活性和强大功能。一、装饰器简介装饰器是一个函数,它接受一个函数作为参数,并返回一个新的函数。这......
  • SAP BI:商业智能的必备利器
     在当今竞争激烈的商业环境中,企业需要从海量的数据中获取有价值的信息,以做出明智的决策。SAPBI(BusinessIntelligence)作为一款强大的商业智能解决方案,正逐渐成为企业不可或缺的利器。 一、SAPBI的概述SAPBI是一套完整的商业解决方案,旨在将企业中现有的数据进行有效的整合。......
  • LeCun谢赛宁首发全新视觉多模态模型,等效1000张A100干翻GPT-4V,AI视频长度扩展调优技术:E
    LeCun谢赛宁首发全新视觉多模态模型,等效1000张A100干翻GPT-4V,AI视频长度扩展调优技术:ExVideo帮你轻松生成更长、更优质的视频,EVTexture:提升视频分辨率的新方法!利用AI将模糊视频变清晰!近日,LeCun和谢赛宁等大佬,共同提出了这一种全新的SOTAMLLM——Cambrian-1。开创了以视觉为中心的......
  • AWTK fscript 中的 value 扩展函数
    fscript是AWTK内置的脚本引擎,开发者可以在UIXML文件中直接嵌入fscript脚本,提高开发效率。本文介绍一下fscript中的**value扩展函数**value扩展函数value相关的辅助函数。1.value_is_valid判断value是否有效。原型value_is_valid(v)=>bool示例vara=object_c......
  • fastapi-events fastapi 异步事件分发处理扩展
    fastapi-eventsfastapi异步事件分发处理扩展,提供了本地,以及远程消息处理能力,同时包含了一些内置的handler,对于自定义handler也是比较灵活的参考使用app.pyfromfastapiimportFastAPIfromfastapi.requestsimportRequestfromfastapi.responsesimportJSONResponsefrom......
  • ONNX模型部署利器ONNXRUNTIME框架
    1.ONNXRUNTIME介绍        ONNX格式模型部署兼容性最强的框架ONNXRUNTIME,基本上不会有算子不支持跟不兼容的情况出现,只要能导出ONNX格式模型,它基本上都能成功加载,成功推理。虽然在CPU速度不及OpenVINO、GPU上速度不及TensorRT,但是胜在兼容性强,支持不同硬件上推理部署......
  • swap分区扩展
    1.查看当前swap分区情况 2.使用dd创建一个4g大小的swap文件 3.将这个swap文件变成swap分区格式 4.启动交换分区,建议将swap文件权限设置为0600 5.检验 6.配置持久化,编辑/etc/fstab文件/home/swapswapswapdefaults00附删除分区步骤:1.swapoff /home/sw......