Spring 设计模式之装饰器模式

Spring 设计模式之装饰器模式

  • 装饰器模式
  • 用到的场景
  • 具体的java例子:

装饰器模式

装饰器模式允许我们在不修改原始类(即被装饰对象)的情况下,动态地向对象添加新的行为或修改现有行为。

用到的场景

存在一个原始类,在不改动原始类的基础上,新建一个类来继承原始类里面的方法或者改动这些方法,亦可增加独属于自己的方法。
简单来说就是以原始类为原型进行扩展

需要存在的核心类:
1.原始类
2.装饰器基类(抽象)
3.具体的装饰类

具体的java例子:

// 假设 Coffee 是一个接口,定义了咖啡的基本属性和方法  
public interface Coffee {String getDescription();double getCost();
}// 原始类;基本的咖啡实现  
class BasicCoffee implements Coffee {@Overridepublic String getDescription() {return "基础咖啡";}@Overridepublic double getCost() {return 2.0;}
}// 装饰器基类,持有对另一个 Coffee 对象的引用  
abstract class Decorator implements Coffee {protected Coffee coffee;public Decorator(Coffee coffee) {this.coffee = coffee;}@Overridepublic String getDescription() {return coffee.getDescription();}@Overridepublic double getCost() {return coffee.getCost();}
}// 具体的装饰器,添加牛奶  
class MilkDecorator extends Decorator {public MilkDecorator(Coffee coffee) {super(coffee);}@Overridepublic String getDescription() {return coffee.getDescription() + ",加牛奶";}@Overridepublic double getCost() {return coffee.getCost() + 0.5; // 假设加牛奶要额外0.5美元  }
}// 具体的装饰器,改描述、改价格
class GzDecorator extends Decorator {public GzDecorator(Coffee coffee) {super(coffee);}@Overridepublic String getDescription() {return "换描述了:GzDecorator";}@Overridepublic double getCost() {return 100; //}
}// 具体的装饰器,改描述、改价格
class TjDecorator extends Decorator {public TjDecorator(Coffee coffee) {super(coffee);}@Overridepublic String getDescription() {return "换描述了:TjDecorator";}@Overridepublic double getCost() {return 100; //}public String addSomethingSpecial() {return "我自己加的新方法哦...";}
}// 使用示例  
class Main {public static void main(String[] args) {// 创建一个基础咖啡对象  Coffee coffee = new BasicCoffee();  System.out.println("装饰前: " + coffee.getDescription() + " - $" + coffee.getCost());  // 第一个装饰器:加牛奶  coffee = new MilkDecorator(coffee);  System.out.println("加牛奶后: " + coffee.getDescription() + " - $" + coffee.getCost());  // 第二个装饰器:GzDecorator(换描述、换价格)  coffee = new GzDecorator(coffee);  System.out.println("GzDecorator装饰后: " + coffee.getDescription() + " - $" + coffee.getCost());  // 注意:这里我们不再将TjDecorator直接创建为TjDecorator coffee1,而是也作为coffee的一个装饰器  // 第三个装饰器:TjDecorator(换描述、换价格,并添加新方法)  coffee = new TjDecorator(coffee);  System.out.println("TjDecorator装饰后: " + coffee.getDescription() + " - $" + coffee.getCost()  + " " + ((TjDecorator) coffee).addSomethingSpecial()); // 需要强制类型转换来调用addSomethingSpecial()  }
}

输出结果

装饰前: 基础咖啡 - $2.0
装饰后: 基础咖啡,加牛奶 - $2.5
装饰后: 换描述了:GzDecorator - $100.0
装饰后: 换描述了:TjDecorator - $100.0 我自己加的新方法哦...

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

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

相关文章

星巴克们需要找回节奏

“重返星巴克”需要更多运气。 作者|金豫 编辑|杨舟 国内咖啡市场正上演着一场后浪推前浪的经典剧目。 近期,“太平洋咖啡”传出大规模关店的消息。该品牌在多座城市中仅剩下几家门店,且多数集中在机场。而在2016年前后,太平洋咖啡一度超越…

React 前端框架全面教程:从入门到进阶

React 前端框架全面教程:从入门到进阶 引言 在现代前端开发中,React 作为一款流行的 JavaScript 库,以其组件化、声明式的特性和强大的生态系统,成为了开发者的首选。无论是构建单页应用(SPA)还是复杂的用…

【日志】网络传输协议TCP/UDP/HTTP // unity泛型类单例模式

2024.10.23 【力扣刷题】 暂无 【数据结构】 暂无 【其他】 TCP(传输控制协议)(长连接): TCP 是一种面向连接的、可靠的协议,它通过三次握手建立连接,确保数据的可靠传输。 第一次是客户端向服…

【力扣 + 牛客 | SQL题 | 每日4题】牛客大厂面试真题W3,W10

1. 牛客大厂面试真题SQLW3:分析客户逾期情况 1.1 题目: 描述 有贷款信息表:loan_tb(agreement_id:合同id,customer_id:客户id,loan_amount:贷款金额,pay_a…

在 Windows 中使用 GCC 编译运行 C++

在 Windows 中使用 GCC 编译开发 C 通过 MSYS2 安装 MinGW 工具链 MSYS2(Minimal SYStem 2)是一个集成了大量的GNU工具链、工具和库的开源软件包集合。它提供了一个类似于 Linux 的shell环境,可以在 Windows 系统中编译和运行许多 Linux 应…

铝基板PCB创建助手

支持在创建元件时创建网表 支持圆形和矩形阵列布局 支持板框信息修改 支持缺口位置修改 支持元件封装预览 支持原理图预览 支持PCB板框和布局预览 支持灯珠方向更改为切向和径向 支持报告输出 支持元件封装选择 铝基板PCB创建助手 V1.0

Nginx 配置基于IP 地址的 Web 服务器

Nginx 配置基于IP 地址的 Web 服务器 1.配置网卡 nmcli connection modify ipv4.address 192.168.232.130/24 ipv4.gateway 192.168.232.2 ipv4.dns 192.168.232.2 ipv4.method manual connection.autoconnect yes 2.添加ip地址 nmcli connection modify ens160 ipv4.address…

如何理解全局和局部的规律

再和大家聊的话题是全局和局部的辩证关系。 研究全局和局部的辩证关系,研究的就是做事的方法。 不过这里说的做事的方法不是具体的执行办法,比如这一步应该怎么做,那一步应该怎么做。 而是重在思考,应该先做什么,后…

GPT-Sovits-2-微调模型

1. 大致步骤 上一步整理完数据集后&#xff0c;此步输入数据, 微调2个模型VITS和GPT&#xff0c;位置在 <<1-GPT-SoVITS-tts>>下的<<1B-微调训练>> 页面的两个按钮分别执行两个文件: <./GPT_SoVITS/s2_train.py> 这一步微调VITS的预训练模型…

SQLite 数据库设计最佳实践

SQLite特点 SQLite是一款功能强大的 轻量级嵌入式数据库 ,具有以下显著特点: 体积小 :最低配置仅需几百KB内存,适用于资源受限环境。 高性能 :访问速度快,运行效率高于许多开源数据库。 高度可移植 :兼容多种硬件和软件平台。 零配置 :无需复杂设置,开箱即用。 自给自…

【Linux】ClickHouse 部署

搭建Clickhouse集群时&#xff0c;需要使用Zookeeper去实现集群副本之间的同步&#xff0c;所以需要先搭建zookeeper集群 1、卸载 # 检查有哪些clickhouse依赖包&#xff1a; [rootlocalhost ~]# yum list installed | grep clickhouse# 移除依赖包&#xff1a; [rootlocalho…

【LeetCode】两数之和、大数相加

主页&#xff1a;HABUO&#x1f341;主页&#xff1a;HABUO 1.两数之和 题目&#xff1a;给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一…

计算机毕业设计——ssm基于JAVA的OA办公系统的设计与实现演示录像2021

作者&#xff1a;程序媛9688开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等。 &#x1f31f;文末获取源码数据库&#x1f31f;感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff08;免费咨询指导选题&#xff09;&#xff0…

根据输入的详细地址解析经纬度

摘要&#xff1a; 今天遇到一个需求&#xff1a;就是做客户导入的时候因为导入的客户地址的时候没有经纬度的&#xff0c;但是同步的时候需要经纬度的&#xff0c;所以还是要根据客户提供的详细地址解析出来对应的经纬度&#xff01;回填到对应的经纬度的表单之中进行客户的同步…

【文心智能体 | AI大师工坊】如何使用智能体插件,完成一款旅游类智能体的开发,来体验一下我的智能体『​​​​​​​背包客』

&#x1f680;『背包客』点击前往体验&#xff1a;https://mbd.baidu.com/ma/s/d7RHMlWh 最近参加了百度文心智能体平台AI大师工坊&#x1f389;活动&#xff0c;在这个活动中&#xff0c;我利用文心平台提供的各种插件、大模型等工具&#xff0c;打造了一个工具类的智能体应用…

使用Docker Compose简化微服务部署

文章目录 Docker Compose简介安装Docker Compose在Windows上安装Docker Compose在macOS上安装Docker Compose在Linux上安装Docker Compose 创建Docker Compose文件创建compose文件构建并运行服务 使用Docker Compose网络定义网络验证网络连接 使用Docker Compose卷定义卷使用卷…

WPF的触发器(Trigger)

WPF&#xff08;Windows Presentation Foundation&#xff09;是微软.NET框架的一部分&#xff0c;用于构建Windows客户端应用程序。在WPF中&#xff0c;触发器&#xff08;Triggers&#xff09;是一种强大的功能&#xff0c;允许开发者根据控件的状态或属性值来动态改变控件的…

ChatGPT、Python和OpenCV支持下的空天地遥感数据识别与计算——从0基础到15个案例实战应用

在科技飞速发展的时代&#xff0c;遥感数据的精准分析已经成为推动各行业智能决策的关键工具。从无人机监测农田到卫星数据支持气候研究&#xff0c;空天地遥感数据正以前所未有的方式为科研和商业带来深刻变革。然而&#xff0c;对于许多专业人士而言&#xff0c;如何高效地处…

Linux rabbitmq客户端 SimpleAmqpClient 源码编译

SimpleAmqpClient的编译成库&#xff0c;加入到工程中 1、下载SimpleAmqpClient 源码&#xff1a; git克隆的路径为&#xff1a;https://github.com/alanxz/SimpleAmqpClient.git 下载压缩包路径&#xff1a;https://codeload.github.com/alanxz/SimpleAmqpClient/zip/maste…

Java中String的length与Oracle数据库中VARCHAR2实际存储长度不一致的问题

目录 一、根本原因 二、解决方案 一、根本原因 Oracle数据库新增数据的时候报如下错误&#xff1a; 先给大家看个小案例&#xff0c;这样更好去理解&#xff0c;下面是一段测试代码&#xff1a; 这里面我分别列举了三种字符串&#xff0c;中文&#xff0c;英文和数字以及两种…