设计模式(结构型模式)装饰器模式

目录

    • 一、简介
    • 二、装饰器模式
      • 2.1、组件信息
      • 2.2、具体组件信息
      • 2.3、颜色装饰器抽象类
      • 2.4、颜色装饰器实现类
    • 三、使用
      • 3.1、测试
      • 3.2、优缺点

一、简介

  装饰器模式是一种结构型设计模式,它允许向现有对象动态地添加新功能,同时又不改变其结构。它通过创建包装对象来包裹原始类,在不改变其接口的情况下,为对象添加新的行为或责任。

装饰器模式通常包含以下角色:

  • Component(组件) :定义了一个对象接口,可以动态地添加新的功能。
  • ConcreteComponent(具体组件) :实现了组件接口,是被装饰的类。
  • Decorator(装饰器抽象类) :实现了组件接口,并持有一个对组件对象的引用,在其内部包装组件对象,可以动态地为组件添加新的功能。
  • ConcreteDecorator(具体装饰器类) :继承自装饰器抽象类,具体实现了装饰功能,可以添加具体的行为。

二、装饰器模式

2.1、组件信息

  假设我们有一个形状的接口,它有一个画形状的方法

public interface Shape {// 画一个形状void draw();
}

2.2、具体组件信息

  圆形组件和方形组件实现了上面的接口,代码如下:

// 具体的形状类 - 圆形
public class Circle implements Shape {public void draw() {System.out.println("画了一个圆形:Circle");}
}// 具体的形状类 - 方形
public class Square implements Shape {public void draw() {System.out.println("画了一个方形:Square");}
}

2.3、颜色装饰器抽象类

// 装饰器抽象类
abstract class ColorDecorator implements Shape {protected Shape decoratedShape;protected String color;public ColorDecorator(Shape decoratedShape, String color) {this.decoratedShape = decoratedShape;this.color = color;}public void draw() {decoratedShape.draw();System.out.println("装饰一个颜色: " + color);}
}

2.4、颜色装饰器实现类

// 圆形颜色装饰器
public class CircleColorDecorator extends ColorDecorator {public CircleColorDecorator(Shape decoratedShape, String color) {super(decoratedShape, color);}
}// 方形颜色装饰器
public class SquareColorDecorator extends ColorDecorator {public SquareColorDecorator(Shape decoratedShape, String color) {super(decoratedShape, color);}
}

三、使用

3.1、测试

public class DecoratorPatternExample {public static void main(String[] args) {System.out.println("---------------------基础形状-------------------------");// 创建基础圆形Shape circle = new Circle();circle.draw();// 创建基础方形Shape square = new Square();square.draw();System.out.println("---------------------圆形形状(带颜色)-------------------------");// 装饰成红色的圆形Shape redCircle = new CircleColorDecorator(new Circle(),"red");redCircle.draw();// 装饰成蓝色的圆形Shape blueCircle = new CircleColorDecorator(new Circle(),"blue");blueCircle.draw();System.out.println("---------------------方形形状(带颜色)-------------------------");// 装饰成红色的圆形Shape redSquare = new SquareColorDecorator(new Square(),"red");redSquare.draw();// 装饰成蓝色的方形Shape blueSquare = new SquareColorDecorator(new Square(),"blue");blueSquare.draw();}
}

运行结果:

---------------------基础形状-------------------------
画了一个圆形:Circle
画了一个方形:Square
---------------------圆形形状(带颜色)-------------------------
画了一个圆形:Circle
装饰一个颜色: red
画了一个圆形:Circle
装饰一个颜色: blue
---------------------方形形状(带颜色)-------------------------
画了一个方形:Square
装饰一个颜色: red
画了一个方形:Square
装饰一个颜色: blue

3.2、优缺点

优点:

  • 动态性 : 可以动态地添加或移除对象的功能,不需要修改已有代码。
  • 灵活性 : 可以通过不同的装饰器组合来实现不同的效果,使得扩展变得更加灵活。
  • 遵循开闭原则 : 装饰器模式允许在不修改现有代码的情况下,扩展对象的功能,符合开闭原则。

缺点:

  • 过多的对象 : 可能会导致系统中出现大量的具体装饰器类,增加了对象数量,使得代码复杂性增加。
  • 固定装饰层次 : 当装饰器层次固定时,对于动态地添加新功能有一定的限制,因为需要预先定义好不同的装饰器组合。

  总的来说,装饰器模式是一种灵活且可扩展的模式,它允许在运行时动态地添加新功能,而无需改变现有对象的结构,这使得代码更具灵活性和可维护性。

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

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

相关文章

数据挖掘实战-基于决策树算法构建北京市空气质量预测模型

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

ChatGPT Plus如何升级?信用卡付款失败怎么办?如何使用信用卡升级 ChatGPT Plus?

ChatGPT Plus是OpenAI提供的一种高级服务,它相较于标准版本,提供了更快的响应速度、更强大的功能,并且用户可以优先体验到新推出的功能。 尽管许多用户愿意支付 20 美元的月费来订阅 GPT-4,但在实际支付过程中,特别是…

【面试深度解析】腾讯音乐校招 Java 后端一面:SpringBoot工作机制、缓存雪崩、数据一致性、MySQL索引失效(下)

欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术的推送! 在我后台回复 「资料」 可领取编程高频电子书! 在我后台回复「面试」可领取硬核面试笔记! 文章导读地址…

运维自动化bingo前端

项目目录结构介绍 项目创建完成之后,我们会看到bingo_web项目其实是一个文件夹,我们进入到文件夹内部就会发现一些目录和文件,我们简单回顾一下里面的部分核心目录与文件。 ├─node_modules/ # node的包目录,项目运行的依赖包…

【漏洞库】O2OA系统

O2OA invoke 后台远程命令执行漏洞 CNVD-2020-18740 漏洞描述 O2OA是一款开源免费的企业及团队办公平台,提供门户管理、流程管理、信息管理、数据管理四大平台,集工作汇报、项目协作、移动OA、文档分享、流程审批、数据协作等众多功能,满足企业各类管理和协作需求。 O2OA系…

Java注解与策略模式的奇妙结合:Autowired探秘

大家好,欢迎收听今天的播客节目!我是你们的主持人,也是一位对软件开发充满热情的开发者。在今天的节目中,我们将探讨如何巧妙地结合注解与策略模式,创建一个灵活而强大的策略规则工厂。让我们带着好奇的心情一同深入研…

LeetCode:2.两数相加

目录 题目:​编辑2. 两数相加 - 力扣(LeetCode) 分析问题: 官方的优秀代码博主的注释: 博主的辣眼代码,无注释,拉出来拷打自己: 每日表情包: 2. 两数相加 - 力扣&am…

面试经典150题——文本左右对齐(困难)

​"It always seems impossible until it’s done." - Nelson Mandela 1. 题目描述: 这个题目标为困难题目,但是如果我们静下心来把题目读懂了,其实无非就是不同情况下不同考虑而已,也没什么思维上的复杂,还…

Linux openKylin(开放麒麟)系统SSH服务安装配置与公网远程连接

文章目录 前言1. 安装SSH服务2. 本地SSH连接测试3. openKylin安装Cpolar4. 配置 SSH公网地址5. 公网远程SSH连接6. 固定SSH公网地址7. SSH固定地址连接8. 结语 前言 openKylin是中国首个基于Linux 的桌面操作系统开发者平台,通过开放操作系统源代码的方式&#xff…

C++:第十五讲高精度算法

每日C知识 system("color xx);是改变字体及背景颜色,前一个x代表一个数字,可以改变背景颜色,后一个x代表一个数字,可以改变字体颜色 ,但都是根据颜色表来的。 记住:要加头文件:#include&l…

综合分享1

VM及安装配置windows server 2008 1)安装配置VM 确保是否正确安装: 1)检查本地“网络与internal设置”中的虚拟网卡是否创建成功(vmnet1和vmnet8) 2)必须通过services.msc查看vmware的所有是否已经…

手写分布式存储系统v0.3版本

引言 承接 手写分布式存储系统v0.2版本 ,今天开始新的迭代开发。主要实现 服务发现功能 一、什么是服务发现 由于咱们的服务是分布式的,那从服务管理的角度来看肯定是要有一个机制来知道具体都有哪些实例可以提供服务。举个例子就是,张三家…

DevOps落地笔记-07|案例分析:如何有效管理第三方组件

上一讲主要介绍了如何通过代码预检查的方式提高入库代码的质量,将代码检查尽可能前置,降低修复问题的成本,从而提高交付软件的质量。除了代码本身的问题,依赖组件也是经常困扰开发者的一个问题。比如,依赖组件的某个版…

认识Tomcat (一)

认识Tomcat (一) 一、服务器 1.1 服务器简介 ​ 硬件服务器的构成与一般的PC比较相似,但是服务器在稳定性、安全性、性能等方面都要求更高,因为CPU、芯片组、内存、磁盘系统、网络等硬件和普通PC有所不同。 ​ 软件服务器&…

深度学习(生成式模型)—— Consistency Models

文章目录 前言预备知识:SDE与ODEMethod实验结果 前言 Diffusion model需要多次推断才能生成最终的图像,这将耗费大量的计算资源。前几篇博客我们已经介绍了加速Diffusion model生成图像速率的DDIM和Stable Diffusion,本节将介绍最近大火的Co…

【Matplotlib】figure方法 你真的会了吗!?

🎈个人主页:甜美的江 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:matplotlib 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进…

前端工程化之:webpack2-1(常用扩展)

目录 前言 一、CleanWebpackPlugin 二、HtmlWebpackPlugin 三、CopyPlugin 四、webpack-dev-server 五 、file-loader 六、url-loader 七、路径问题 前言 由于 webpack 、 webpack-cli 、 webpack-dev-server 会存在版本不兼容问题,所以这里使用的版本如下&…

设计模式全览:编程艺术的精髓!

写在前面 请心急的读者直接看往后看「设计模式精炼」!一定不会后悔的! 在编程世界中,设计模式如同优雅的舞者,缠绕在代码的脉络中,引领着程序走向卓越。设计模式解决的是软件开发中经常出现的问题,他们如同…

解放双手!ChatGPT助力编写JAVA框架!

摘要 本文介绍了使用 ChatGPT逐步创建 一个简单的Java框架,包括构思、交流、深入优化、逐步完善和性能测试等步骤。 亲爱的Javaer们,在平时编码的过程中,你是否曾想过编写一个Java框架去为开发提效?但是要么编写框架时感觉无从下…

Tauri:相比Electron,还有很长路要走的。

一、Tauri是什么 Tauri是一个开源的框架,用于构建跨平台的桌面应用程序。它允许开发者使用Web技术(如HTML、CSS和JavaScript)来构建高性能的本地应用程序,同时提供了访问底层操作系统功能的能力。 Tauri的设计目标是提供一种简单…