【设计模式-装饰】

news2024/9/21 4:39:28

定义

装饰模式是一种结构型设计模式,它允许在不改变对象自身的前提下动态地给对象添加职责(功能)。通过使用装饰模式,可以将对象的功能扩展变得更加灵活和可维护,同时避免了类继承的复杂性。

特点

  • 动态扩展对象功能:装饰模式可以在运行时动态地为对象添加新的功能,而不影响其他对象。
  • 遵循开闭原则:装饰模式可以通过组合来扩展对象功能,而不是通过修改类定义,从而遵循开闭原则。
  • 灵活性强:多个装饰者可以自由组合,为对象添加不同的功能。

组成

装饰模式由以下几个部分组成:

  • 组件接口(Component):定义了对象的通用接口,可以被具体的组件和装饰者类实现。
  • 具体组件(Concrete Component):实现组件接口的类,表示可以被装饰的原始对象。
  • 装饰器接口(Decorator):实现了组件接口,并持有一个组件对象的引用,用于对该对象进行装饰。
  • 具体装饰器(Concrete Decorator):扩展装饰器类,实现额外的功能,并可以调用被装饰对象的原始功能。

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(); // 调用原始操作
        addedBehaviorA();  // 添加额外的功能
    }

    // 装饰器A的附加功能
    private void addedBehaviorA() {
        System.out.println("ConcreteDecoratorA: Adding behavior A.");
    }
}

// 具体装饰器B,为组件添加另外的功能
public class ConcreteDecoratorB extends Decorator {
    public ConcreteDecoratorB(Component component) {
        super(component);
    }

    @Override
    public void operation() {
        super.operation(); // 调用原始操作
        addedBehaviorB();  // 添加额外的功能
    }

    // 装饰器B的附加功能
    private void addedBehaviorB() {
        System.out.println("ConcreteDecoratorB: Adding behavior B.");
    }
}

client

public class DecoratorPatternExample {
    public static void main(String[] args) {
        // 创建原始组件对象
        Component component = new ConcreteComponent();

        // 使用装饰器A进行装饰
        Component decoratedComponentA = new ConcreteDecoratorA(component);
        decoratedComponentA.operation();
        System.out.println();

        // 使用装饰器B进行装饰
        Component decoratedComponentB = new ConcreteDecoratorB(component);
        decoratedComponentB.operation();
        System.out.println();

        // 使用装饰器A和B进行多重装饰
        Component decoratedComponentAB = new ConcreteDecoratorB(decoratedComponentA);
        decoratedComponentAB.operation();
    }
}

优点

  • 灵活扩展功能:可以在运行时动态地为对象添加新功能,而无需修改类的定义或继承类。
  • 遵循开闭原则:通过组合而不是继承来扩展对象功能,使得系统更具扩展性。
  • 减少子类数量:避免了通过继承来扩展功能的情况,减少了系统中类的数量和复杂性。

缺点

  • 增加复杂性:由于装饰器和原始组件都实现了相同的接口,可能会导致系统中对象的层次结构变得复杂,尤其是多重装饰时。
  • 依赖细节:装饰器依赖于被装饰的组件接口,可能会导致依赖关系复杂化,特别是在多层装饰的情况下。

场景

  • 需要动态扩展对象功能:当需要在运行时为对象添加或修改功能时,可以使用装饰模式。
  • 替代继承:当不想通过继承来扩展类的功能,或无法通过继承(如第三方库中的类不能修改)时,可以使用装饰模式。
  • 需要对对象进行多重装饰:当对象需要被多次装饰,以不同的方式扩展功能时,可以使用装饰模式。

总结

装饰模式提供了一种灵活且可扩展的方式来为对象添加功能,避免了类继承的复杂性和局限性。通过将对象和装饰器组合,可以在运行时动态地为对象添加不同的功能,从而使系统更加灵活和可维护。然而,装饰模式也可能增加系统的复杂性,尤其是在多层装饰的情况下,因此需要在设计时进行权衡。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2079295.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

猫咪浮毛满天飞?希喂、IAM、352三款宠物空气净化器测试对比

我作为一名养宠三年的铲屎官,用过不少清理工具,可惜都效果不佳。经过朋友的推荐,我了解到宠物空气净化器这种产品,想要购入使用。在挑选时我发现,目前市面上宠物空气净化器品牌繁多,质量难辨。因此&#xf…

【iOS端】基于Uniapp跨平台接入即构RTC+相芯美颜

0 Uniapp平台接入完成iOS端的即构RTC相芯美颜 Uniapp最大优势是跨平台,前面介绍了如何在android中接入相芯美颜即构RTC,今天咱们把相同的代码接入到iOS中。按照惯例我们先看最终效果,欢迎大家评论讨论: 1 开发配置准备 iOS开发因…

YOLOv8目标检测部署RK3588全过程,附代码pt->onnx->rknn,附【详细代码】

目录 一、训练yolov8模型,得到最佳权重文件best.pt 二、pt转onnx,即best.pt->best11.onnx 1、对下载的YOLOv8代码修改 2、加入模型导出功能, 3、导出指令采用如下代码 三、ONNX转RKNN 四、RK3588部署 1、拷贝rknn文件到rk3588板子内 2、执行…

.NET6 多环境 在Windows IIS部署的应用场景

前言: 通常情况下 我们部署Web站点 需要用到 测试环境 和 正式环境 2个环境 Staging环境 或者其他环境 视 团队所处阶段、团队规模、质量要求、风险控制要求、第3方协议而定 1.我们把上一讲 IX.MultiEnvironment 这个项目发布到IIS中 2.IIS配置3个环境 我们重点…

MathType2025最新破解版补丁包+永久免费安装包win+mac系统

有一类笔记特别受欢迎,那就是“数学公式的排版”。这些笔记通常以图文并茂的方式,展示了如何使用各种工具来排版数学公式。其中,MathType 7 是最受欢迎的工具之一,它不仅功能强大、使用方便,还能让你轻松地制作出精美的…

Tailor:免费开源 AI 视频神器,创作者必备利器

目录 引言一、创新特性,引领视频编辑新潮流1. 智能人脸剪辑2. 精准语音剪辑3. 自动化口播生成4. 多样化字幕生成5. 一键式色彩生成 二、简单易用,新手也能快速上手1. 下载和安装2. 功能选择3. 操作流程 三、广泛应用,满足不同创作需求四、代码…

别让语法拖后腿:ChatGPT助你告别改稿噩梦!【建议收藏】

学术论文的撰写是研究成果传播的关键。清晰、准确、逻辑严密的表达对于学术论文的质量至关重要。人工智能技术的快速发展,尤其是ChatGPT 4.0的推出,为学术写作提供了新的辅助工具。本文将探讨如何有效利用ChatGPT 4.0进行论文润色。 ChatGPT&#xff1a…

线性代数:如何由AB=E 推出 BA=AB?

最近在二刷线性代数,在看逆矩阵定义的时候发现了这个问题。于是决定写一写,给出一种证明方式。 一、由逆矩阵的定义出发 这是我在mooc-山东大学-线性代数(秦静老师)第一章第十讲的ppt上截取的定义。 看到这个定义我就在想&#xf…

如何在Java中使用protobuf

写在前面 本文看下在Java中如何使用protofbuf。 1:介绍 1.1:什么是protobuf 是一种数据格式,同json,xml,等。但是一种二进制数据格式。 1.2:强在哪里?为啥要用? 小&#xff0c…

图新说-调整标绘线面的压盖顺序的两种方法

0.序 图新说作为一个三维可视化汇报工具,在公安消防领域常用于做态势标绘,应急救援方案,安保预案等。 如果撤离路线,或者行进路线【线对象】经过了水源地、危险区等【面对象】。如何确保线对象显示在面对象的上面,不被…

MyBatis中的占位符解析机制

深入理解 MyBatis 中的 #{} 占位符解析机制 在使用 MyBatis 进行数据库操作时,#{} 占位符是我们非常常用的一个特性。它能够将 Java 对象的属性值与 SQL 语句中的参数进行映射。在实际使用中,MyBatis 如何解析 #{} 占位符并获取对应的属性值呢&#xff…

如何实现低成本降噪?风扇噪声流体仿真解决方案

本文将说明工程师如何能够使用气动解决方案来模拟和降低一款小型发电机柜冷却风扇的噪音。ultraFluidX 的模拟结果将设备内部的流场和声场可视化,研究风扇和机柜内其他部件的相互作用,确认噪声源来自何处(协助工程师采取有效的降噪措施&#…

Mybatis中的缓存

一,为什么要使用缓存 1,缓存的作用 缓存(cache)的作用是为了减去数据库的压力,提高查询性能。 缓存实现的原理是 从数据库中查询出来的对象在使用完后不要销毁,而是存储在内存(缓存) 中&#…

zipkin启动发生报错 : Failed to start bean ‘armeriaServerGracefulShutdownLifecycle‘;

报错详情 : 在windows下启动zipkin的时候发生报错 : Failed to start bean ‘armeriaServerGracefulShutdownLifecycle’;nested exception is java.util.concurrent.CompletionException: java.lang.IllegalStateException: Armeria server failed to start解决 : 由于z…

SSM网上书店--附源码96453

摘 要 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势;对于网上书店当然也不能排除在外,随着网络技术的不断成熟,带动了网上书店,它彻底改变了过去传统的管理方式…

安装cvxpy时遇到“subprocess-exited-with-error”的解决方式

尝试联邦学习时,遇到了这个问题,但实际上仔细看报错就能找到源头 ①更新cmake版本到3.17 参考此文即可更新 https://blog.csdn.net/why1249777255/article/details/138505546 【报错点中“Found CMake:…………”这一行,在不满足要求时会说…

信息学奥赛一本通编程启蒙(不断更新ing~)

可以作为c初学者的练习题,我会挑选有部分有代表意义的题目作为学生的课后作业,后面会在专栏中陆续更新题目解析,并附在这一篇文章的链接中 信息学奥赛一本通-编程启蒙(C版)在线评测系统 https://bas.ssoier.cn/index…

安全升级,智启未来!广东工业安全生产数智化转型闭门分享会圆满举办

8月26日,由华为技术有限公司(以下简称“华为”)与广州英码信息科技有限公司(以下简称“英码科技”)联合主办,广东省应急产业协会为支持单位的“广东工业安全生产数智化转型闭门分享会”在广州圆满举行。本次…

整合优化方案即将批复,您准备好了吗?

在自然保护地管理的新时代,规划编制的复杂性和高要求常常让各级管理者和规划者面临重重挑战。整合优化方案即将批复,规划任务将十分繁重!为了应对这些难题,“自然保护地总体规划智能编制系统”应运而生,旨在为规划编制…

iPhone短信误删如何恢复,四种方法找回短信

在日常使用手机的过程中,我们可能会因为误操作或其他原因不小心删除了重要的短信。这些短信可能包含了工作沟通、家人关怀或朋友间的温馨对话,一旦丢失,难免让人感到焦虑和不安。不过,别担心,针对iPhone短信误删的问题…