23种设计模式之一— — — —装饰模式详细介绍与讲解

装饰模式详细讲解

  • 一、定义
  • 二、装饰模式结构
      • 核心思想
      • 模式角色
      • 模式的UML类图
      • 应用场景
      • 模式优点
      • 模式缺点
  • 实例演示
      • 图示
      • 代码演示
      • 运行结果

一、定义

装饰模式(别名:包装器)
装饰模式(Decorator Pattern)是结构型的设计模式,它允许在运行时动态地向对象添加新的职责或功能,同时保持对象的原始类不变。通过使用装饰器模式,可以在不修改现有代码的基础上扩展对象的功能,

二、装饰模式结构

核心思想

1.动态扩展:在不改变原类结构和继承关系的情况下,动态地为对象添加功能。
2.包装对象:通过创建一个包装对象(装饰器)来包裹真实对象,增加额外功能。
3.接口一致性:装饰器与真实对象有相同的接口,确保客户端能以相同的方式与两者交互。
4.开闭原则:对扩展开放,对修改关闭。新的功能通过添加装饰器实现,而不是修改原类。
5.灵活组合:允许通过组合多个装饰器来创建功能更为丰富的对象

模式角色

1.抽象组件(Component):定义一个接口,用于规范准备接收附加责任的对象(即被装饰对象)。
2.具体组件(ConcreteComponent):实现抽象组件接口,是装饰器要装饰的真实对象。
3.装饰器(Decorator):持有一个抽象组件的引用,并继承抽象组件的接口。它既可以使用所持有的引用调用被装饰的组件的方法,也可以增加新的功能。
4.具体装饰器(ConcreteDecorator):实现装饰器接口并给具体组件添加职责。它通常包含对具体组件的引用,以及一个或多个用于增加功能的额外方法。
这些角色在装饰模式中的交互方式是:

  • 抽象组件定义了所有装饰器对象和被装饰对象需要实现的接口。
  • 具体组件实现了抽象组件接口,是准备被装饰的对象。
  • 装饰器持有一个对抽象组件的引用,并且实现了抽象组件接口。它可以使用这个引用来调用被装饰对象的方法,并在调用前后添加新的功能。
  • 具体装饰器实现了装饰器接口,并且给具体组件添加新的职责。它通常包含一个指向被装饰对象的引用,以及用于实现附加功能的代码。

模式的UML类图

在这里插入图片描述

应用场景

  • 当需要为单个对象提供多种不同的行为或者表现形式时。
  • 需要向一个已经存在的类中添加功能,但又不希望修改该类的源代码或继承其子类时
  • 组合对象:当需要组合多个对象来创建一个具有更多功能的对象时,装饰模式是一个很好的选择。通过递归组合方式,可以构建出一个具有多种功能的对象。例如,在文件系统中,文件夹可以被视为一个特殊的文件,它可以包含其他文件和文件夹。使用装饰模式,可以将文件夹装饰为一个包含额外功能的对象,如支持加密、压缩等

模式优点

  • 动态地给对象添加功能,相比生成子类更加灵活、透明。
  • 无需修改原有类就可以扩展功能,符合开闭原则。
  • 装饰器可以被组合,以便在运行时动态地、多次地添加多个职责。

模式缺点

  • 这种比继承更加灵活机动的特性,也同时意味着更加多的复杂性。
  • 装饰模式会导致设计中出现许多小类,如果过度使用,会使程序变得很复杂。
  • 不易调试:由于装饰器模式涉及到多个对象的交互,调试可能会变得相对困难。特别是当装饰器链很长时,追踪请求和响应的路径可能会变得复杂。

实例演示

图示

鸡腿堡应用:
在这里插入图片描述

代码演示

package ZhuangShiMoShi;public abstract class Humburger {protected String name;public String getName() {return name;}public abstract double getPrice();}package ZhuangShiMoShi;public class ChickenBurger extends Humburger {public ChickenBurger(){name="鸡腿堡";}public double getPrice(){return 10;}}package ZhuangShiMoShi;public abstract class Condiment extends Humburger {protected Humburger humburger;public abstract String getName();}package ZhuangShiMoShi;public class Chilli extends Condiment {public Humburger hum;public Chilli(Humburger hum) {this.hum = hum;}@Overridepublic String getName() {// TODO Auto-generated method stubreturn hum.getName() + " 加辣椒";}@Overridepublic double getPrice() {// TODO Auto-generated method stubreturn hum.getPrice();}}package ZhuangShiMoShi;public class Lettuce extends Condiment {public Humburger hum;public Lettuce(Humburger hum) {this.hum = hum;}@Overridepublic String getName() {// TODO Auto-generated method stubreturn hum.getName()+" 加生菜";}@Overridepublic double getPrice() {// TODO Auto-generated method stubreturn hum.getPrice()+1.5;}}

测试类:

package ZhuangShiMoShi;public class Test {public static void main(String[] args) {Humburger hum = new ChickenBurger();System.out.println(hum.getName() + " 价钱:" + hum.getPrice());Lettuce lettuce=new Lettuce(hum);System.out.println(lettuce.getName()+" 价钱:"+lettuce.getPrice());Chilli chilli1=new Chilli(hum);System.out.println(chilli1.getName()+" 价钱:"+chilli1.getPrice());Chilli chilli2=new Chilli(lettuce);System.out.println(chilli2.getName()+" 价钱:"+chilli2.getPrice());}}

运行结果

在这里插入图片描述

该代码主体是鸡腿堡,可以选择通过添加生菜、酱、辣椒等等许多其他的配料,并根据选择的配料计算相应的价格。
博主用心写,读者点关注;互动传真情,知识不迷路

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

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

相关文章

LeetCode 每日一题 数学篇 2651.计算列车到站时间

给你一个正整数 arrivalTime 表示列车正点到站的时间(单位:小时),另给你一个正整数 delayedTime 表示列车延误的小时数。 返回列车实际到站的时间。 注意,该问题中的时间采用 24 小时制。 int findDelayedArrivalTi…

学业辅导导师:文心一言智能体详细介绍和开发

一、前言 本期题目 开发方向:学习成长类 解读: AI技术在学习成长方向的应用正日益增多,本期赛题需围绕该方向开发智能体包括但不限于:作文辅导助手、个性化学习助手、考试助手、各垂类教育内容专家等 二、我的智能体:学业辅导…

macbook中foxmail的通讯录迁移

之前windows中用习惯了foxmail,换成macbook后,还是沿用foxmail。使用一段时间后,确实受不了foxmail的不便:1、版本比较低1.5.6,很多windows新版的功能都没有;2、动不动莫名其妙崩溃,写了半天的邮件,点击发送就直接崩了,又得重新写。 忍耐了几个月后,下定决心换成网易…

2.10 mysql设置远程访问权限

2.10 mysql设置远程访问权限 目录1. 管理员运行mysql命令窗口2. 使用 root 用户重新登录 MySQL3. 修改用户权限4. 修改mysql安装目录下的my.ini 目录 说明: Mysql8.0 设置远程访问权限 一、Mysql8.0 设置远程访问权限 1. 管理员运行mysql命令窗口 2. 使用 root 用…

matlab安装及破解

一、如何下载 软件下载链接,密码:98ai 本来我想自己生成一个永久百度网盘链接的,但是: 等不住了,所以大家就用上面的链接吧。 二、下载花絮 百度网盘下载速度比上载速度还慢,我给充了个会员&#xff0c…

【1】:计算机图形学概述

从技术角度讲,什么是好的画面呢? 看这个画面是不是足够亮,也就是全局光照做的够好 什么是计算机图形学? 使用计算机合成和操作可视信息。 应用场景 Video Games 游戏 Movie 电影 Animation 动画 Design 设计:CAD等软件相关…

修复CentOS 6.6服务器YUM和RPM功能异常的技术实践20240523

修复CentOS 6.6服务器YUM和RPM功能异常的技术实践 引言 在复杂的生产环境中,服务器的稳定性至关重要。近期,我们遇到了一台CentOS 6.6服务器在执行yum update -y时被中断,导致YUM和RPM功能异常的问题。本文将详细介绍问题的诊断、解决过程以及…

java中变量名单独占用一个空间吗,为什么能直接使用变量名而不需要给java地址,变量名和地址之间有什么关系

在 Java 中,变量名不单独占用存储空间,但它们确实在内存中有对应的地址。为了理解这一点,我们需要深入了解变量名和内存地址之间的关系。 变量名与内存地址 变量名的作用: 在 Java 程序中,变量名是用于引用存储在内存中的数据的…

git显示提交次数

git shortlog 是一个特殊版本的 git log 命令,旨在创建发布公告。它将每个提交按作者分组,并显示每个提交消息的第一行。这是一种快速查看不同作者在项目中的贡献的方式。 以下是 git shortlog 的一些常用参数: -n 或 --numbered&#xff1…

Java多线程——Lambda表达式

λ希腊字母表中排序第十一位的字母,英语名称为Lambda; 避免匿名内部类定义过多; 其实质属于函数式编程的概念。 为什么要用Lambda表达式? 1. 避免匿名内部类定义过多; 2. 可以让你的代码看起来更简洁; …

OpenAI 文生图模型演进:DDPM、IDDPM、ADM、GLIDE、DALL-E 2、DALL-E 3

节前,我们星球组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学。 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 合集&#x…

WPF使用Prism实现简单订餐系统

新建wpf项目,nuget引入Prism.DryIoc,MaterialDesignThemes 引入后,修改App.xaml 前台引入 xmlns:prism"http://prismlibrary.com/"和prism:PrismApplication App.xaml.cs App.xaml.cs继承PrismApplication,重写CreateS…

在线等!3damx渲染爆内存怎么办?

在使用V-Ray进行CPU渲染时,复杂场景和高渲染设置可能会导致内存消耗过高,进而影响渲染速度,导致处理异常、机器停滞、应用程序崩溃等情况。 为机器配置更大的 RAM 始终是解决问题的最有效办法,但如果出于预算等原因无法实现&…

Lua的几个特殊用法

:/.的区别 详细可以参考https://zhuanlan.zhihu.com/p/651619116。最重要的不同就是传递默认参数self。 通过.调用函数,传递self实例 通过 : 调用函数,传递self (不需要显示的传递self参数,默认就会传递,但…

调出idea解决冲突界面

背景 我对idea使用不熟练,还是习惯用git bash来合并代码,合并爆冲突后,我进入idea准备解决冲突,却发现找不到解决冲突的界面。 解决 右击idea中冲突的文件,将鼠标移动到菜单栏的git上,此时应该出现包含有…

Leecode热题100--二分查找---33:搜索旋转排序矩阵

题目: 整数数组 nums 按升序排列,数组中的值 互不相同 。 给你 旋转后 的数组 nums 和一个整数 target ,如果 nums 中存在这个目标值 target ,则返回它的下标,否则返回 -1 。 思路: 此处采用容易理解的两次…

端口扫描利器--nmap

目录 普通扫描 几种指定目标的方法 TCP/UDP扫描 端口服务扫描 综合扫描 普通扫描 基于端口连接并响应(真实) ​ nmap -sn 网段(0/24)-sn 几种指定目标的方法 单个IP扫描 IP范围扫描 扫描文件里的IP 扫描网段,(排除某IP) 扫描网段(排除某清单IP) TCP/UDP扫描 -sS …

linux中逻辑卷管理与扩展

逻辑卷管理与扩展 逻辑卷 作用: 1.整合分散的空间2.空间支持扩大 逻辑卷制作过程:将众多的物理卷(PV)组建成卷组(VG),再从卷组中划分出逻辑卷(LV) 逻辑卷的逻辑思路 …

哪些公司防泄密软件最受欢迎?2024年防泄密软件排行榜 |

在数字化时代,数据的安全性和保密性已成为企业运营和发展的关键要素。随着技术的不断进步,防泄密软件逐渐成为了企业保护核心数据和知识产权的重要工具。在2024年,市场上涌现出了众多防泄密软件,它们各具特色,为企业的…

杨校老师课题之基于Idea的SSM实训项目案例开发之在线手机商城开发(一)【非常适合初学者】

1.前期配置 2.开发涉及技术栈和工具 2.1 技术栈 后端: SSM前端:Html、CSS、BootStrap(官方定义好的CSS样式)数据库: MySQL 2.2 开发环境(工具) 进行本次开发,需要具备如下环境: JDK a. JDK8.0/1.8 b. 注意: 没有JDK是无法运行IdeaIDEA a. …