当前位置: 首页 > news >正文

Java设计模式-结构型模式-装饰模式

装饰模式

  • 装饰模式
    • 角色
    • 案例
    • 装饰模式与静态代理的区别

装饰模式

允许向一个现有的对象动态地添加新的功能,同时不改变其结构。它是继承的一种替代方案,可以动态地扩展对象。有点像静态代理

角色

装饰者模式有四种角色 抽象被装饰者,被装饰者,装饰者和抽象被装饰者

  • 抽象被装饰者:一般是一个接口,包含需要被装饰的方法
  • 被装饰者:实现 抽象被装饰者 接口,代表被装饰的原始对象。
  • 抽象装饰者:继承或实现抽象被装饰者,内部含有一个 抽象被装饰者的属性,调用或增强 被装饰者的方法
  • 装饰者:实现抽象装饰者的方法,给被装饰对象增加具体的职责

案例

今天不开包子店,想开一家奶茶店。产品有普通奶茶,为了奶茶种类丰富,需要支持添加多种小料,椰果,芋圆等,且可以自由组合。
根据要求,先建立起基础类
接口 Tea,用来表示 抽象被装饰类,MilkTea 用来表示 被装饰类

/*** 抽象被装饰者**/
public interface Tea {String getName();int getPrice();
}
/*** 被装饰者:奶茶**/
public class MilkTea implements Tea{@Overridepublic String getName() {return "奶茶";}@Overridepublic int getPrice() {return 10;}
}

分析下问题,想要支持可以自由组合的方式来 增强奶茶类,普通的继承和组合 很难实现。所以才使用装饰者模式
下面是装饰者的代码

/*** 抽象装饰者:奶茶小料**/
public abstract class AbsDecoratorIngredients implements Tea{final private Tea tea;public AbsDecoratorIngredients(Tea tea) {this.tea = tea;}@Overridepublic int getPrice() {//执行目标对象原本的行为return tea.getPrice();}@Overridepublic String getName() {//执行目标对象原本的行为return tea.getName();}
}
/*** 装饰者:椰果**/
public class DecoratorCoconut extends AbsDecoratorIngredients{public DecoratorCoconut(Tea tea) {super(tea);}@Overridepublic int getPrice() {/*被装饰者的价格 + 当前椰果的价格*/return super.getPrice() + 2;}@Overridepublic String getName() {return super.getName() + " + " + "椰果";}
}
/*** 装饰者:芋圆**/
public class DecoratorTaroBall extends AbsDecoratorIngredients{public DecoratorTaroBall(Tea tea) {super(tea);}@Overridepublic int getPrice() {/*被装饰者的价格 + 当前椰果的价格*/return super.getPrice() + 2;}@Overridepublic String getName() {return super.getName() + " + " + "椰果";}
}

测试代码:

public class DecoratorTest {public static void main(String[] args) {/*给我一杯奶茶*/System.out.println("==========================给我一杯奶茶====================================");Tea milkTea = new MilkTea();System.out.println(milkTea.getName() + " = " + milkTea.getPrice());/*给我一杯珍珠奶茶*/System.out.println("===========================给我一杯珍珠奶茶===================================");milkTea = new DecoratorTaroBall(milkTea);System.out.println(milkTea.getName() + " = " + milkTea.getPrice());/*给我一杯珍珠椰果奶茶*/System.out.println("============================给我一杯珍珠椰果奶茶==================================");milkTea = new DecoratorCoconut(milkTea);System.out.println(milkTea.getName() + " = " + milkTea.getPrice());}
}输出:
==========================给我一杯奶茶====================================
奶茶 = 10
===========================给我一杯珍珠奶茶===================================
奶茶 + 椰果 = 12
============================给我一杯珍珠椰果奶茶==================================
奶茶 + 椰果 + 椰果 = 14

在这里插入图片描述

看到这里,可能有人发现 抽象装饰者类 好像可以省略。
是的,这个例子是可以省略的,
这里只是写的 装饰者模式的标准写法。使用一个抽象装饰者 是为了 将 抽象被装饰者 和 装饰者 解耦。

一旦把 抽象装饰者省略,大家可能发现这个写法是不是很眼熟,是不是很像 静态代理。
其实 设计模式 就是这样,23种设计模式只是应对不同的场景,不同的设计模式总会有相似之处。
设计模式来源于设计原则,万变不离其宗,稍微变换下就是另一种设计模式。

下面看下 装饰和静态代理的区别

装饰模式与静态代理的区别

装饰模式:目标对象由外界传入,目的是为了增强该对象
静态代理:目标对象由内部生成,目的是隐藏和保护该对象
装饰模式一般会迭代传入不同的对象,一步一步的增强方法
静态代理一般只传入一个对象,只调用一层

相关文章:

Java设计模式-结构型模式-装饰模式

装饰模式 装饰模式角色案例装饰模式与静态代理的区别 装饰模式 允许向一个现有的对象动态地添加新的功能,同时不改变其结构。它是继承的一种替代方案,可以动态地扩展对象。有点像静态代理 角色 装饰者模式有四种角色 抽象被装饰者,被装饰者…...

这7个“小毛病”项目经理必须克服

大家好,我是老原。 项目经理干项目可能不在行,但“踩坑”、“背锅”一定在行。 当上项目经理不容易,当好项目经理更不容易,有永远填不完的坑和背不完的锅。 如果要问项目经理都踩过哪些坑,那真的是太多了&#xff0…...

一言成文大模型:大模型实践之路

元宇宙_一言成文大模型...

【VSCode】配置C/C++开发环境教程(Windows系统)

下载和配置MinGW编译器 首先,我们需要下载并配置MinGW编译器。 下载MinGW编译器,并将其放置在一个不含空格和中文字符的目录下。 配置环境变量PATH 打开控制面板。可以通过在Windows搜索栏中输入"控制面板"来找到它。 在控制面板中&#xf…...

算法实战:亲自写红黑树之四 插入insert的平衡

本文承接自: 算法实战:亲自写红黑树之一-CSDN博客 算法实战:亲自写红黑树之二 完整代码-CSDN博客 算法实战:亲自写红黑树之三 算法详解-CSDN博客 目录 一、入口 二、普通二叉树插入 三、插入后的平衡 四、算法解惑 一、入口 入…...

JWT 技术

一、介绍 JWT全称:JSON Web Token 官网:https://jwt.io/ 定义了一种简洁的、自包含的格式,用于在通信双方以 json 数据格式安全的传输信息。由于数字签名的存在,这些信息是可靠的 在生成 JWT 令牌时,会对 JSON 格式的数…...

003.文件描述符、重定向

1、文件描述符 文件描述符是与输入和输出流相关联的整数。最广为人知的文件描述符是stdin、stdout和stderr。我们可以将某个文件描述符的内容重定向到另一个文件描述符中。 在编写脚本的时候会频繁用到标准输入(stdin)、标准输出(stdout&am…...

图论| 827. 最大人工岛 127. 单词接龙

827. 最大人工岛 题目:给你一个大小为 n x n 二进制矩阵 grid 。最多 只能将一格 0 变成 1 。返回执行此操作后,grid 中最大的岛屿面积是多少? 岛屿 由一组上、下、左、右四个方向相连的 1 形成。 题目链接:[827. 最大人工岛](ht…...

2023年中国恒温蜡疗仪发展趋势分析:应用前景存有很大发展与探索空间[图]

恒温电蜡疗仪可将蜡熔化,利用蜡自身特点,能阻止热的传导、散热慢、气体和水分不易消失,保温性能优越。利用蜡能紧密贴于体表的可塑性,可加入其他药物协同进行治疗,也可将中药与蜡疗有机地结合在一起,产生柔…...

认识“协议”

文章目录: 什么是协议结构化的数据传输序列化和反序列化网络版本计算器 什么是协议 在计算机网络中,协议是指在网络中进行通信和数据交换时,双方遵循的规则和约定集合。它定义了数据的传输格式、顺序、错误处理、认证和安全性等方面的规范。 …...

GO语言的由来与发展历程

Go语言,也称为Golang,是由Google公司的Robert Griesemer、Ken Thompson和Rob Pike三个大牛于2007年开始设计发明,并于2009年正式对外发布的开源编程语言。 三名初始人的目标是设计一种适应网络和多核时代的C语言,Go语言从C继承了…...

MPN – 制造零件号

S/4 1610 中的 MPN – 基于 NAST 的输出管理 我试图查找有关 MPN 设置的信息,但找不到详细的配置步骤。在浏览了一些信息和 help.sap 链接后,我能够在 S/4 1610 系统中配置 MPN 设置,这与使用旧输出类型(Nast 和输出类型 NEU&…...

Redis企业级问题及解决方案

1.1 缓存预热 场景:“宕机” 服务器启动后迅速宕机 问题排查: 1.请求数量较高,大量的请求过来之后都需要去从缓存中获取数据,但是缓存中又没有,此时从数据库中查找数据然后将数据再存入缓存,造成了短期…...

【2021集创赛】基于arm Cortex-M3处理器与深度学习加速器的实时人脸口罩检测 SoC

团队介绍 参赛单位:深圳大学 队伍名称:光之巨人队 指导老师:钟世达、袁涛 参赛队员:冯昊港、潘家豪、慕镐泽 图1 团队风采 1. 项目简介 新冠疫情席卷全球,有效佩戴口罩可以极大程度地减小病毒感染的风险。本项目开发…...

B码的相关知识点笔记

B码(B-Code)通常是指中国北斗卫星导航系统的坐标编码方式。北斗卫星导航系统使用的坐标系是WGS-84,而B码是针对WGS-84坐标系进行编码的一种方式。 B码的格式通常为18位或24位,其中包含以下信息: 前两位为国家码&…...

java“贪吃蛇”小游戏

基于java实现贪吃蛇小游戏,主要通过绘制不同的图片并以一定速度一帧一帧地在窗体上进行展示。 我是在javaSwing项目下创建了一个包 名字叫做:Snakes包 包下有一个启动类和一个设置代码的主界面两个类 代码主界面: 代码主界面主要讲解的是 …...

【面试经典150 | 位运算】数字范围按位与

文章目录 Tag题目来源题目解读解题思路方法一:公共前缀方法二:n & (n-1) 写在最后 Tag 【位运算】 题目来源 201. 数字范围按位与 题目解读 计算给定区间内所有整数的按位与的结果。 解题思路 本题朴素的方法是直接将区间内的所有整数按位与&…...

推介会如何做好媒体宣传

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 推介会是一种专为企业、社会组织和团体、政府等提供的展示自身特点、产品和政策的活动形式,旨在促进交流活动,形成合作,从而带来共同利益。推介会的本…...

【ROS导航Navigation】五 | 导航相关的消息 | 地图 | 里程计 | 坐标变换 | 定位 | 目标点和路径规划 | 激光雷达 | 相机

致谢:ROS赵虚左老师 Introduction Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 参考赵虚左老师的实战教程 一、地图 nav_msgs/MapMetaData 地图元数据,包括地图的宽度、高度、分辨率等。 nav_msgs/OccupancyGrid 地图栅格数据&#…...

什么是脏读、不可重复读、幻读讲解

数据库隔离级别是数据库管理系统中一个重要的概念,它定义了事务之间的可见性和影响。在多用户并发访问数据库时,隔离级别能够确保事务之间的相互独立性,避免数据不一致的问题。本文将深入探讨三种常见的并发问题:脏读、不可重复读…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...

OpenLayers 分屏对比(地图联动)

注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

多模态图像修复系统:基于深度学习的图片修复实现

多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...

Python Einops库:深度学习中的张量操作革命

Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...

抽象类和接口(全)

一、抽象类 1.概念:如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法,包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中,⼀个类如果被 abs…...

认识CMake并使用CMake构建自己的第一个项目

1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...