小谈设计模式(7)—装饰模式

小谈设计模式(7)—装饰模式

  • 专栏介绍
    • 专栏地址
    • 专栏介绍
  • 装饰模式
    • 装饰模式角色
      • Component(抽象组件)
      • ConcreteComponent(具体组件)
      • Decorator(抽象装饰器)
      • ConcreteDecorator(具体装饰器)
    • 工作流程
      • 首先
      • 其次
      • 然后
      • 最后
    • Java代码实现
      • 代码分析
    • 优缺点分析
      • 优点
        • 符合开闭原则
        • 可以动态地添加/删除功能
        • 遵循单一职责原则
        • 装饰器类与具体组件类独立
      • 缺点
        • 可能产生过多的具体装饰器类
        • 装饰器与组件类的接口不一致
    • 总结

专栏介绍

专栏地址

link

专栏介绍

主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。
在这里插入图片描述

装饰模式

装饰模式(Decorator Pattern)是一种结构型设计模式,它允许你动态地向一个对象添加额外的功能,而不需要修改其原始类。通过将对象包装在装饰器类中,你可以在不改变现有对象结构的情况下,逐步地添加功能。

装饰模式角色

在这里插入图片描述

Component(抽象组件)

定义了具体组件和装饰器的共同接口,可以是抽象类或接口。

ConcreteComponent(具体组件)

实现了抽象组件定义的接口,是被装饰的原始对象。

Decorator(抽象装饰器)

包含一个指向具体组件的引用,并实现了抽象组件定义的接口。

ConcreteDecorator(具体装饰器)

通过装饰器对具体组件进行扩展或修改,添加额外的功能。

在这里插入图片描述

工作流程

首先

定义一个抽象组件(Component),它声明了具体组件和装饰器共同的接口方法。

其次

创建一个具体组件(ConcreteComponent),它实现了抽象组件的接口方法,是被装饰的原始对象。

然后

创建一个抽象装饰器(Decorator),它也实现了抽象组件的接口方法,并包含一个指向具体组件的成员变量(通常为抽象组件类型),用于持有被装饰的对象。

最后

创建具体装饰器(ConcreteDecorator),它继承自抽象装饰器,并在装饰器的基础上添加了额外的功能。具体装饰器中通常会重写抽象组件的接口方法,以在调用前后进行额外的处理,然后再调用被装饰对象的相应方法。
在这里插入图片描述

Java代码实现

// Step 1: 定义抽象组件
interface Component {void operation();
}// Step 2: 创建具体组件
class ConcreteComponent implements Component {public void operation() {System.out.println("执行具体组件的操作");}
}// Step 3: 创建抽象装饰器
abstract class Decorator implements Component {protected Component component;public Decorator(Component component) {this.component = component;}public void operation() {component.operation();}
}// Step 4: 创建具体装饰器
class ConcreteDecorator extends Decorator {public ConcreteDecorator(Component component) {super(component);}public void operation() {// 在调用具体组件操作前进行额外处理System.out.println("在调用具体组件操作前进行额外处理");// 调用具体组件的操作super.operation();// 在调用具体组件操作后进行额外处理System.out.println("在调用具体组件操作后进行额外处理");}
}// 使用装饰模式
public class Main {public static void main(String[] args) {// 创建具体组件对象Component component = new ConcreteComponent();// 创建具体装饰器对象,并将具体组件对象传入Component decorator = new ConcreteDecorator(component);// 调用装饰后的操作decorator.operation();}
}

代码分析

Component 是抽象组件接口,ConcreteComponent 是具体组件类,实现了抽象组件接口的方法。Decorator 是抽象装饰器类,实现了抽象组件接口,并持有一个抽象组件类型的成员变量。ConcreteDecorator 是具体装饰器类,继承自抽象装饰器类,并重写了操作方法,在调用前后添加了额外处理。

在主函数中,先创建具体组件对象ConcreteComponent,然后将其传入具体装饰器对象ConcreteDecorator 的构造函数中,用装饰器包装具体组件。最后调用装饰后的操作,会按照一定的顺序执行额外处理和具体组件操作。

优缺点分析

优点

符合开闭原则

可以在不修改现有代码的情况下,通过新增装饰器类来扩展对象的功能。

可以动态地添加/删除功能

可以根据需要动态地添加或删除对象的功能,组合不同的装饰器实现不同的行为组合。

遵循单一职责原则

具体的组件类只负责核心功能,具体的装饰器类只关注附加的功能,各个类职责明确,可维护性高。

装饰器类与具体组件类独立

装饰器类与具体组件类之间是松耦合的关系,可以独立变化,增加或删除装饰器不会影响其他组件的行为。

缺点

可能产生过多的具体装饰器类

如果系统中有很多功能需要扩展,可能会导致产生大量的具体装饰器类,增加系统的复杂性。

装饰器与组件类的接口不一致

在装饰器模式中,装饰器类和具体组件类的接口不一致,导致客户端需要区分调用。
在这里插入图片描述

总结

装饰模式提供了一种灵活的、可扩展的方式来修改对象的功能,同时保持了简单的接口和代码的可维护性。但是需要权衡好扩展的复杂度和对象接口的一致性。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

玩转数据-大数据-Flink SQL 中的时间属性

一、说明 时间属性是大数据中的一个重要方面,像窗口(在 Table API 和 SQL )这种基于时间的操作,需要有时间信息。我们可以通过时间属性来更加灵活高效地处理数据,下面我们通过处理时间和事件时间来探讨一下Flink SQL …

解决前端二进制流下载的文件(例如:excel)打不开的问题

1. 现在后端请求数据后,返回了一个二进制的数据,我们要把它下载下来。 这是响应的数据: 2. 这是调用接口的地方: uploadOk(){if(this.files.length 0){return this.$Message.warning("请选择上传文件!&#xff…

小白vite+vue3搭建项目整个流程

第一步 查看npm 版本npm -v,npm版本是7,创建项目命令: npm create vitelatest threejsVue -- --template vue第二步 // 进入项目名为threejsVue的项目命令 cd threejsVue // 安装路由 npm install vue-router4 // 安装css npm install -D s…

十、空闲任务及其钩子函数

1、空闲任务的介绍 (1)一个良好的程序,它的任务都是事件驱动的:平时大部分时间处于阻塞状态。 (2)有可能我们自己创建的所有任务都无法执行,但是调度器必须能找到一个可以运行的任务。所以,我们要提供空闲任务。 (3)在使用vTas…

Python日期的加减等操作

嗨喽,大家好呀~这里是爱看美女的茜茜呐 日期输出格式化 所有日期、时间的api都在datetime模块内。 👇 👇 👇 更多精彩机密、教程,尽在下方,赶紧点击了解吧~ python源码、视频教程、插件安装教程、资料我都…

揭秘:机构招生电子传单制作的五个黄金法则

机构招生微传单制作一直都是让很多人在意的事情。一款好的微传单不仅可以吸引更多的学生,还可以省去很多招生工作的时间和精力。但是,很多人却不知道如何制作一款精美的微传单。下面就让我们来学习一下如何制作一款机构招生的微传单吧。 首先&#xff0c…

亲和力的作用,以及提高亲和力的六个办法

亲和力指的是容易使人亲近,当人身处集体中,亲和力也即是影响力和凝聚力的体现。通常是在职场中会明确对亲和力的考评,尤其是某些管理型岗位,所以HR人力资源管理中对亲和力有详细的评级标准。不过这里小猫测试网不详细讨论亲和力的…

敏感性分析一览

敏感性分析 SobolMorrisFourier Amplitude Sensitivity Test (FAST)Random Balance Designs - Fourier Amplitude Sensitivity Test (RBD-FAST)Delta Moment-Independent MeasureDerivative-based Global Sensitivity Measure (DGSM)Fractional Factorial Sensitivity Analysis…

服务器数据恢复-zfs下raidz多块磁盘离线导致服务器崩溃的数据恢复案例

服务器数据恢复环境: 一台服务器共配备32块硬盘,组建了4组RAIDZ,Windows操作系统zfs文件系统。 服务器故障: 服务器在运行过程中突然崩溃,经过初步检测检测没有发现服务器存在物理故障,重启服务器后故障依…

YOLOv7改进:结合CotNet Transformer结构

1.简介 京东AI研究院提出的一种新的注意力结构。将CoT Block代替了ResNet结构中的3x3卷积,在分类检测分割等任务效果都出类拔萃 论文:Contextual Transformer Networks for Visual Recognition 论文地址:https://arxiv.org/abs/2107.12292 有…

技术Leader对下管理的法宝-SMART

SMART方法论 源于国外管理大师的《管理的实践》是管理者能够更加明确员工高效工作的利器,科学、规范的对员工绩效制定考核目标和考核标准5个单词缩写 Specific:目标要具体Measurable:目标成果要可衡量(量化) Attainable:目标要可实现,避免过高/过低Rel…

模块化CSS

1、什么是模块化CSS 模块化CSS是一种将CSS样式表的规则和样式定义封装到模块或组件级别的方法,以便于更好地管理、维护和组织样式代码。这种方法通过将样式与特定的HTML元素或组件相关联,提供了一种更具可维护性、可复用性和隔离性的方式来处理样式。简单…

SpringBoot读取配置的方式

在 Spring Boot 应用中,我们通常需要一些配置信息来指导应用的运行。这些配置信息可以包括如下内容:端口号、数据库连接信息、日志配置、缓存配置、认证配置、等等。Spring Boot 提供了多种方式来读取这些配置信息。读取配置的目的是为了在程序中使用这些…

前端JavaScript入门到精通,javascript核心进阶ES6语法、API、js高级等基础知识和实战 —— Web APIs(三)

思维导图 全选案例 大按钮控制小按钮 小按钮控制大按钮 css伪类选择器checked <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><…

Apache Commons Pool2 池化技术

对象池是一种设计模式&#xff0c;用于管理和重用对象&#xff0c;以提高性能和资源利用率。对象池的概念在许多应用程序中都有广泛应用&#xff0c;特别是在需要频繁创建和销毁对象的情况下&#xff0c;例如数据库连接、线程、HTTP连接等 对象池通过预先创建一组对象并将它们存…

B. Comparison String

题目&#xff1a; 样例&#xff1a; 输入 4 4 <<>> 4 >><< 5 >>>>> 7 <><><><输出 3 3 6 2 思路&#xff1a; 由题意&#xff0c;条件是 又因为要使用尽可能少的数字&#xff0c;这是一道贪心题&#xff0c;所以…

最大内切圆算法计算裂缝宽度

本文这里是对CSDN上另一位博主的代码进行了整理&#xff1a; 基于opencv的裂缝宽度检测算法&#xff08;计算轮廓最大内切圆算法&#xff09; 我觉得这位博主应该是上传了一个代码草稿&#xff0c;我对其进行了重新整理&#xff0c;并添加了详细的注释。 import cv2 import …

ICCV 2023|Occ2Net,一种基于3D 占据估计的有效且稳健的带有遮挡区域的图像匹配方法...

本文为大家介绍一篇入选ICCV 2023的论文&#xff0c;《Occ2Net: Robust Image Matching Based on 3D Occupancy Estimation for Occluded Regions》&#xff0c; 一种基于3D 占据估计的有效且稳健的带有遮挡区域的图像匹配方法。 论文链接&#xff1a;https://arxiv.org/abs/23…

[红明谷CTF 2021]write_shell %09绕过过滤空格 ``执行

目录 1.正常短标签 2.短标签配合内联执行 看看代码 <?php error_reporting(0); highlight_file(__FILE__); function check($input){if(preg_match("/| |_|php|;|~|\\^|\\|eval|{|}/i",$input)){ 过滤了 木马类型的东西// if(preg_match("/| |_||php/&quo…

Java应用生产Full GC或者OOM问题如何定位

1 引言 生产应用服务频繁Full GC却无法释放内存&#xff0c;甚至可能OOM&#xff0c;这种情况很有可能是内存泄露或者堆内存分配不足&#xff0c;此时需要dump堆信息来定位问题&#xff0c;查看是哪些地方内存泄漏。 Dump文件也称为内存转储文件或内存快照文件&#xff0c;是…