装饰者模式实现和JDK中的应用

news2024/11/13 0:20:47

🎯 设计模式专栏,持续更新中, 欢迎订阅:JAVA实现设计模式
🛠️ 希望小伙伴们一键三连,有问题私信都会回复,或者在评论区直接发言

装饰者模式

文章目录

  • 装饰者模式
    • 🎯 核心要点:
    • 例子解析:咖啡饮品系统 ☕️
    • 🧩 UML结构图解释
    • Java代码实现:咖啡系统
      • Step 1: 定义基本组件接口
      • Step 2: 实现具体的咖啡类
      • Step 3: 定义装饰者基类
      • Step 4: 创建具体的装饰者类
      • Step 5: 使用装饰者模式创建咖啡订单
    • 装饰者模式在JDK中的应用
      • Java I/O 系列中的装饰者模式
    • 🧠 总结:

装饰者模式,也叫装饰模式,是一种结构型设计模式。它允许通过将对象放入特殊的包装对象中来为对象添加新行为,而无需修改原始对象的代码。关键思想是“包装”,我们用装饰类将对象嵌套起来,从而动态地给对象添加功能。

🎯 核心要点:

  • 对象的功能扩展:不改变现有类的结构,动态地为对象添加新的功能。
  • 遵循开放-封闭原则:类应对扩展开放,对修改封闭。
  • 组合代替继承:相比通过继承扩展功能,装饰模式更倾向于组合对象。

例子解析:咖啡饮品系统 ☕️

假设我们有一个基本的咖啡类,用户可以购买基本咖啡,但他们也可以通过添加配料(比如牛奶、糖、巧克力等)来丰富咖啡的口味。装饰者模式完美地符合这个需求。

🧩 UML结构图解释

在这里插入图片描述

  1. Component(组件接口):定义一个接口,表示对象的基本功能。
  2. ConcreteComponent(具体组件):实现基本功能的具体对象。
  3. Decorator(装饰者):持有一个 Component 引用,并实现 Component 接口。
  4. ConcreteDecorator(具体装饰者):继承 Decorator,通过组合和扩展为基本功能添加附加功能。

Java代码实现:咖啡系统

Step 1: 定义基本组件接口

public abstract class Drink {

    // 描述
    public String des;
    // 价格
    private float price = 0.0f;

    /**
     * 计算价格
     * @return
     */
    public abstract float cost();

    public String getDes() {
        return des;
    }

    public void setDes(String des) {
        this.des = des;
    }

    public float getPrice() {
        return price;
    }

    public void setPrice(float price) {
        this.price = price;
    }
}

public class Coffee extends Drink{
    @Override
    public float cost() {
        return super.getPrice();
    }
}

Step 2: 实现具体的咖啡类

public class LongBlack extends Coffee{
    public LongBlack() {
        setDes("LongBlack");
        setPrice(35.0f);
    }
}

public class Espresso extends Coffee{
    public Espresso() {
        setDes("Espresso(蒸汽加压煮出的)浓咖啡");
        setPrice(15.0f);
    }
}

public class ShortBlack extends Coffee{
    public ShortBlack() {
        setDes("ShortBlack浓缩咖啡");
        setPrice(20.0f);
    }

}
public class DeCaf extends Coffee{
    public DeCaf() {
        setDes("DeCaf无咖啡因咖啡");
        setPrice(6.0f);
    }
}

Step 3: 定义装饰者基类

public class Decorator extends Drink {

    private Drink obj;

    public Decorator(Drink obj) {
        this.obj = obj;
    }

    /**
     * 计算价格
     * 调用被装饰者的价格
     * @return
     */
    @Override
    public float cost() {
        return super.getPrice() + obj.cost();
    }


    @Override
    public String getDes() {
        // obj.getDes() 输出被装饰者的信息
        return des + "价格:" + getPrice() +" + " +obj.getDes() +":" + obj.getPrice();
    }
}

Step 4: 创建具体的装饰者类

// 加巧克力功能的装饰器
public class ChocolateDecorator extends Decorator{
    public ChocolateDecorator(Drink obj) {
        super(obj);
        setDes(" 巧克力 ");
        setPrice(3.0f); 
    }
}
// 加奶
public class MilkDecorator extends Decorator{
    public MilkDecorator(Drink obj) {
        super(obj);
        setDes("加奶");
        setPrice(2.0f);
    }
}
// 加糖
public class SugarDecorator extends Decorator{

    public SugarDecorator(Drink obj) {
        super(obj);
        setDes("加糖");
        setPrice(1.5f);
    }
}

Step 5: 使用装饰者模式创建咖啡订单

public class CoffeeShopDemo {
    public static void main(String[] args) {
        Drink drink = new ShortBlack();
        System.out.println("浓缩咖啡描述:" + drink.getDes());
        System.out.println("浓缩咖啡价格:" + drink.cost());
        System.out.println("------------------------------------------");
        drink = new MilkDecorator(drink);
        System.out.println("加奶的浓缩咖啡描述:" + drink.getDes());
        System.out.println("加奶的浓缩咖啡价格:" + drink.cost());
        System.out.println("------------------------------------------");
        drink = new ChocolateDecorator(drink);
        System.out.println("加奶和巧克力的浓缩咖啡描述:" + drink.getDes());
        System.out.println("加奶和巧克力的浓缩咖啡价格:" + drink.cost());
    }
}

装饰者模式在JDK中的应用

Java I/O 系列中的装饰者模式

Java I/O 类库是装饰者模式的经典实现之一,它通过装饰者模式增强了各种流(Stream)的功能,例如:BufferedInputStream, DataInputStream 等类都是对 InputStream 的装饰。

在这里插入图片描述

关键类:InputStream 系列

  • InputStream:抽象组件,定义了基础的输入操作。
  • FileInputStream:具体组件,提供文件流读取功能。
  • BufferedInputStreamDataInputStream:具体装饰者,提供了缓存、数据类型读取等额外功能。

代码示例:

// 基本的文件输入流
InputStream fileInput = new FileInputStream("file.txt");

// 装饰为带缓存的输入流
InputStream bufferedInput = new BufferedInputStream(fileInput);

// 装饰为带数据输入功能的流
DataInputStream dataInput = new DataInputStream(bufferedInput);

int data = dataInput.readInt(); // 使用增强功能读取整型数据

  • BufferedInputStream:增强了基础 InputStream,通过引入缓存机制来提高性能。
  • DataInputStream:增强了基础 InputStream,提供了直接读取原始数据类型(如 intfloat)的能力,而不是逐字节操作

Java I/O 是装饰者模式的经典应用,通过为流对象逐层装饰增加功能(如缓存、数据类型读写等)。

🧠 总结:

  • 装饰者模式通过组合多个装饰类,为对象动态地添加功能。
  • 每个装饰者对象都封装了另一个对象,可以无限扩展功能。
  • 对比继承,装饰者模式更加灵活、动态。

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

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

相关文章

【保姆级教程】基于OpenCV实现实时道路车道检测【附完整源码】

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 👍感谢小伙伴们点赞、关注! 《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发…

安装python,jupter notebook,anaconda换源

目标: 学会安装Anaconda实验环境,创建Anaconda虚拟环境 能够设置国内镜像源 设置好Jupyter Notebook的文件存储路径并学会基本用法 内容: 一、安装Anaconda 首先,打开Anaconda官方网站(https://www.anaconda.com/…

stm32单片机个人学习笔记1(简单介绍)

前言 本篇文章属于stm32单片机(以下简称单片机)的学习笔记,来源于B站教学视频。下面是这位up主的视频链接。本文为个人学习笔记,只能做参考,细节方面建议观看视频,肯定受益匪浅。 STM32入门教程-2023版 细…

辛巴赔付到账,罗永浩退一赔三:直播带货终于往好方向卷了下…

因为快手顶流辛巴扔出的一颗重磅炸弹「被辛巴架火上烤,带货顶流圈快乱成一锅粥了……」,把直播带货行业藏在深处的淤泥炸出了水面。 原本表面看上去清澈、安静的水面,越来越浑,且还冒着火星子!‍‍‍‍‍‍‍ 自从这个…

别让恶意刷票毁了你的项目,学会这6招防刷技巧!

我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货! 大家好,我是小米,一个29岁,积极活泼的技术爱好者!今天想跟大家聊一聊,在做个人项目时,如何有效地防止“刷”行为。无论是刷票、刷流量,还是恶意请…

DPDK基础入门(十):虚拟化

I/O虚拟化 全虚拟化:宿主机截获客户机对I/O设备的访问请求,然后通过软件模拟真实的硬件。这种方式对客户机而言非常透明,无需考虑底层硬件的情况,不需要修改操作系统。 半虚拟化:通过前端驱动/后端驱动模拟实现I/O虚拟…

腾讯云2024年数字生态大会开发者嘉年华(数据库动手实验)TDSQL-C初体验

在2024年9月5-6日,有幸参加了腾讯云举办的2024年数字生态大会开发者嘉年华。 有幸体验了腾讯的多项黑科技和云计算知识。特别是在“增一行代码”互动展区,体验了腾讯云云计算数据库TDSQL-C技术并进行了动手实验。这些技术充分展示了腾讯在云计算的强大实…

Antd - Form 表单提交onfinish函数不生效

Antd - Form 表单提交onfinish函数不生效 问题复现问题修复 问题复现 const onFinish: FormProps<InvoiceTitleInfo>[onFinish] (values) > {console.log(values); } const rules [() > ({validator() {const address form.getFieldValue(address) || ;if (!ad…

安装MongoDB启动报错:找不到共享库文件libcrypto.so.10

查看依赖 ldd mongodb/bin/mongod MongoDB4.2.0需要依赖openssl10相关资源&#xff0c;必须先在Linux中安装openssl10。 执行命令&#xff1a;yum install compat-openssl10 下载完后最后执行ldd mongod看到文件都已经存在

MySQL -- 体系结构、索引结构

1 MySQL体系结构 英文版&#xff1a; 中文版&#xff1a; 以上图可知&#xff0c;MySQL的体系结构划分为以下4层&#xff1a; &#xff08;1&#xff09;网络接入层&#xff1a; &#xff08;2&#xff09;服务层&#xff1a; &#xff08;3&#xff09;存储引擎层&#x…

【软件测试】自动化测试-概念篇

&#x1f334;自动化 &#x1f6a9;自动化的概念 自动的代替人的行完成操作。 自动化在生活中处处可见 自动洒水自机&#xff0c;主要通上水就可以自动化洒水并且可以自动的旋转。 自动洗手液&#xff0c;免去了手动挤压可以自动感应出洗手液超市自动闸门&#xff0c;不需要手…

知识笔记合集

文章目录 vsCode可以运行c程序却无法运行c程序帆软填报属性不起作用java-实体类日期类型格式化Java-数据库id字段使用雪花算法IDEA-快捷键 vsCode可以运行c程序却无法运行c程序 vsCode中的tasks.json文件中添加"-lstdc" {"tasks": [{"type": &…

厉害啦煤炉!Mercari推出Ai Listing,卖家只需要拍照发图片就行!

Mercari&#xff08;中文名“煤炉”&#xff09;是一个日本C2C二手交易平台&#xff0c;类似于中国的“闲鱼”&#xff0c;月活跃用户数量超2,300万。根据2023年11月的财报&#xff0c;Mercari的净利润同比增长高达346%&#xff0c;达到了惊人的28亿日元&#xff01;同时&#…

零基础考过软考信息系统项目管理师经验分享

选择适合的课程&#xff1a;如果你是零基础&#xff0c;建议找一些专门针对新手的课程&#xff0c;讲解通俗易懂。 刷题至关重要&#xff1a;软考的题库很庞大&#xff0c;多做题是必须的。 做好笔记和复习&#xff1a;上课时要做好笔记&#xff0c;课后及时复习&#xff0c;…

弱口令爆破

本文仅作为学习参考使用&#xff0c;本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 本文基于burp抓包软件针对dvwa靶场进行弱口令爆破测试。 靶场设置&#xff1a; 在DVWA Security中&#xff0c;设置安全等级&#xff0c;并保存。 打开靶场。 1&#xff0c;抓包。…

【ArcGIS Pro实操第七期】栅格数据合并、裁剪及统计:以全球不透水面积为例

【ArcGIS Pro实操第七期】批量裁剪&#xff1a;以全球不透水面积为例 准备&#xff1a;数据下载ArcGIS Pro批量裁剪数据集1 数据拼接2 数据裁剪3 数据统计&#xff1a;各栅格取值3.1 栅格计算器-精确提取-栅格数据特定值3.2 数据统计 4 不透水面积变化分析 参考 准备&#xff1…

新品启航,共鉴未来 —— 摩托对讲机EJEAS X10首现重庆国际摩托车展

2024年重庆国际摩托车展&#xff08;CIMA Motor&#xff09;将于9月13日至16日在重庆国际博览中心举行&#xff0c;由三大权威机构联合主办。展会面积达16万平米&#xff0c;汇聚国内外116家展商&#xff0c;吸引千余名观众参与&#xff0c;展示摩托车新品、技术与文化&#xf…

code eintegrity npm err sha512

当 npm install 出现报错的时候&#xff1a; 你应该这样去解决&#xff1a; 删除 package-lock.json 文件&#xff0c;重新执行 npm install。 问题出现的原因 EINTEGRITY 错误码表示在npm缓存中无法找到 指定sha512校验合的模块。 出现这个问题的原因是缓存不一致&…

语义分割数据集|河流湖泊分割|水灾预警

江河湖泊自然水灾检测数据集&#xff0c;数据集整理不易&#xff0c;获取地址在最后&#xff0c;具体信息如下&#xff1a; 总数&#xff1a;290张 类别&#xff1a;1类 数据集大小&#xff1a;约106M 数据整理不易&#xff0c;数据集获取地址如下&#xff1a; https://…

陕西科技大学客座教授向凌云推动了中国新兴科技与教育的产学研结合

近日&#xff0c;陕西科技大学迎来了旅美经济学家向凌云教授的聘任仪式。此次活动在镐京学院会议厅举行&#xff0c;由镐京学院负责人为他颁发了客座教授的聘书。在当前科学技术迅猛发展的背景下&#xff0c;向凌云教授的加入引起了广泛关注&#xff0c;尤其是在教育界和新兴产…