当前位置: 首页 > 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 地图栅格数据&#…...

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

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

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...