设计模式学习——装饰者模式

FilterInputStream与FilterOutputStream FilterInputStream(过滤输入流)是处理流的一种,它包含其他一些输入流,将这些流用作其基本数据源,可以直接传输数据或提供一些额外的功能。   FilterOutputStream是过滤输出流的所有类的超类。这些流位于已存在的输出流(基础 输出流)之上,它们将已存在的输出流作为其基本数据接收器,但可能直接传输数据或提供一些额外的功能。      下面介绍一下它们的一些实现类。 阅读详情



装饰者模式

定义

装饰者模式:动态的将新功能附加到对象上。在对象功能扩展方面,它比继承更有弹性,装饰者模式也体现了开闭原则(ocp)。

类图实例

在这里插入图片描述

代码实例

Drink 抽象类

public abstract class Drink {

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

    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 abstract float cost();
}

Coffee类继承了Drink并重写cost方法。

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

Espresso 类继承Coffee

public class Espresso extends Coffee {

    public Espresso(){
        setDes("意大利咖啡");
        setPrice(6.0f);
    }
}

LongBlack 类继承Coffee

public class LongBlack extends Coffee {

    public LongBlack(){
        setDes("longBlack");
        setPrice(5.0f);
    }
}

ShortBlack 类继承Coffee

public class ShortBlack extends Coffee{

    public ShortBlack(){
        setDes("ShortBlack");
        setPrice(4.0f);
    }
}

Decorator 装饰者

public class Decorator extends Drink {
    private Drink obj = null;

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

    @Override
    public float cost() {
        return super.getPrice() + obj.cost();
    }

    @Override
    public String getDes() {
        return super.des + " " + super.getPrice() + "  &&  " + obj.getDes();
    }

}

Milk类

public class Milk extends Decorator {

    public Milk(Drink obj) {
        super(obj);
        setDes("牛奶");
        setPrice(2.0f);
    }
}

Soy 类

public class Soy extends Decorator {

    public Soy(Drink obj) {
        super(obj);

        setDes("豆浆");
        setPrice(1.5f);
    }
}

Chocolate 类

public class Chocolate extends  Decorator {

    public Chocolate(Drink obj) {
        super(obj);
        setDes("巧克力");
        setPrice(3.0f);
    }
}

装饰者模式在JDK应用的源码分析

FilterInputStream的结构图
在这里插入图片描述

源码分析:
编写测试用例:
在这里插入图片描述
点击FileInputStream 可查看到该类继承了InputStream,InputStream包含众多子类。
在这里插入图片描述
InputSteam包含众多子类。
在这里插入图片描述
InputStream本身是一个抽象类。
在这里插入图片描述
FilterInputSteam继承InputStream作为一个装饰者,DataInputStream是一个具体的修饰者。
FilterInputSteam类中有 protected volatile InputStream in 即 含有被装饰者
在这里插入图片描述
DataInputStream通过构造器向上转型。
在这里插入图片描述

ESP32-S3 SPI驱动SD卡与FATFS文件系统实践 SPI(串行外设接口)是嵌入式系统中常用的同步串行通信协议,通过主从架构实现全双工通信。其工作原理基于时钟同步和数据线传输,具有接线简单、占用引脚少的优势。在存储扩展场景中,SPI模式可驱动SD卡实现大容量数据存储,配合FATFS文件系统可提供标准化的文件管理能力。ESP32-S3作为乐鑫推出的高性能Wi-Fi/蓝牙双模芯片,其SPI外设支持高达80MHz时钟频率,结合ESP-IDF提供的sdspi_host驱动,开发者能快速实现SD卡存储方案。该技术广泛应用于物联网设备日志存储、传感器数据采集等场景,本实 阅读详情

相关推荐

2023-10-20 - MacBook - 优化外接2k显示器体验:告别字小与字虚的终极指南

本文针对MacBook外接2K显示器时普遍遇到的字体过小和边缘发虚问题,提供了终极解决方案。通过深入解析macOS的HiDPI与Retina显示原理,并详细指导使用SwitchResX等工具开启隐藏的HiDPI模式,实现完美的2倍整数缩放,从而在保证字体大小合适的同时获得清晰锐利的显示效果,彻底告别字小与字虚的困扰。

solidity8miner的博客 476

java io -- FilterInputStream 与 装饰者模式

在上一篇文章中讲了FileInputStream 本文将介绍一个特殊的输入字节流:FilterInputStream,以及与之相随的一个经典的设计模式,装饰者模式。 在之前的文章中提到,InputStream的读取是以byte为单位的,但是我们日常中经常会读写其他类型的数据,当然,我们可以把读取出来的字节进行转码,转成我们需要的数据,那么能不能直接读取字符,int等数据呢?能,只需要利用Dat

zhao123h的专栏 1万+

CANoe数据回放实战:如何用Replay Block精准复现实车故障(附ECU数据处理技巧)

本文深入探讨了利用CANoe的Replay Block功能进行数据回放,以精准复现实车偶发性故障的实战方法。文章重点解析了从原始OBD日志中移除目标ECU数据、转换报文方向等核心数据处理技巧,旨在帮助工程师重构真实的网络测试环境,从而高效定位并解决复杂的ECU问题。

nnn11的博客 496

Java IO流之FilterInputStream和FilterOutputStream分析

简介 FilterInputStream和FilteOutputStream分别是过滤输入流和过滤输出流,他们的作用是为基础流提供一些额外的功能.拿FilterInputStream来说,常见的子类有DataInputStream,BufferedInputStream以及PushBackInputStream等.其子类总结为: DataInputStream.数据输入流,以机器无关的方式读取...

梦悠哉的博客 1万+

microduck复刻实战:强化学习机器人从仿真训练到真机部署全攻略

强化学习是智能体通过与环境交互试错来学习最优策略的机器学习范式,在机器人控制领域,常借助物理仿真环境进行策略训练,以降低真实世界的试错成本。其核心原理是通过奖励信号引导策略网络迭代优化,PPO等算法则在稳定性和样本效率之间取得平衡。仿真训练的价值在于可批量验证控制策略,但仿真与真实硬件之间存在物理参数偏差,需通过域随机化等技术实现迁移。从四足机器人到仿生机器人,这类方案广泛应用于复杂运动控制任务。microduck作为一个典型的强化学习机器人项目,其复刻过程涉及环境搭建、奖励设计、PPO调参及Sim-to-

weixin_29061425的博客 361

Windows系统的Mamba环境配置详细教程(状态空间模型)

causal_conv1d也是安装mamba的依赖必须库。安装完成后,通过pip list可以查看到安装的库。Triton是安装mamba的依赖,需要先安装。上述工作准备好后,按下面步骤安装。直接根据离线文件安装即可。是自己的虚拟环境名字。

2301_77831163的博客 3677

设计模式(三)—— 装饰者模式

由于之前看的容易忘记,因此特记录下来,以便学习总结与更好理解,该系列博文也是第一次记录,所有有好多不完善之处请见谅与留言指出,如果有幸大家看到该博文,希望报以参考目的看浏览,如有错误之处,谢谢大家指出与留言。 一、咖啡馆订单系统项目 咖啡馆订单系统项目: 咖啡馆订单项目: 1)、咖啡种类:Espresso、ShortBlack(浓缩)、LongBlack、Decaf (无糖)(这些就...

平凡之路无尽路的博客 2万+

python——体育收入排行2012-2019

请分析文件并读取数据,完成以下功能: 1. 某年的收入排名前若干名选手 如果输入n是2012-19之间的年份,则可以输入整数k,输出n年的前k名排名信息。如果k大于当年排名运动员人数,则输出当年所有的信息。每行一名运动员信息,以' | '间隔该行各项信息。 2. 某年属于某个运动项目的所有运动员信息,和收入总和 如果输入的是'sport'(不区分大小写),则可以继续输入一个年份201*,输出一个当年排行中的运动项目菜单,按照字符串升序排列,格式见示例,再输入运动项目对应的数字来输出该项运动当

m0_62488776的博客 2257

基于Python学习《Head First设计模式》第三章 装饰者模式

完整代码 总结

wzx77的博客 516

用 SNC 和 SAP Single Sign-On Secure Login 把 SAP 登录这件小事,变成一件安全又不用输密码的事

在传统的 SAP 系统里,登录这件事看起来很朴素:用户打开 SAP GUI,输入一个 SAP 用户名,再输入一个 SAP 密码,点回车,进系统,开始干活。表面上没毛病,但从安全角度看,这种老办法问题很大。默认情况下,这些用户名和密码在网络上传输时是明文,也就是不加密传输。攻击者如果在公司网络里做监听,理论上可以直接截取到口令信息,这种风险对今天任何一家合规要求高、审计严格的企业来说,基本是不可接受的。(SAP Help Portal)SAP 给出的答案叫做 ,全称是 。SNC 做的事情可以概括成两类:一类是

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 376

从 SAP BTP trial 到第一个 CPI iFlow 的实操路线图

本文介绍了如何从零开始学习SAP CPI(现称SAP Integration Suite中的Cloud Integration能力)。主要内容包括:1)明确学习边界,建议使用SAP BTP trial账号进行个人练习,注意90天有效期限制;2)理解SAP BTP账号模型层级结构(Global Account→Subaccount→Space);3)详细说明申请trial账号流程,推荐选择Singapore区域以避免兼容问题;4)指导如何检查Entitlements和Quotas,强调应专注于SAP Inte

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 167

HeadFirst 设计模式学习笔记3--装饰模式

本文已搬家至【HeadFirst 设计模式学习笔记】3 装饰模式

gnuhpc的专栏 3431

一文带你了解什么是RDMA

RDMA(Remote Direct Memory Access,远程直接内存访问)是一种起源于高性能计算领域的通信技术,如今已广泛应用于数据中心。该技术使得用户程序能够绕过操作系统内核及CPU,直接与网络接口卡(NIC)交互,实现网络通信。这种方式不仅大幅提升了通信带宽,还显著降低了网络延迟,优化了整体性能。

嵌入式技术开发 6016

设计模式学习之——装饰者模式

设计模式学习,装饰者模式/装饰器模式,不改变结构,动态增加行为。

github_38727595的博客 1067

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

《设计模式》 装饰模式 学习笔记

“单一职责”模式: 在软件组件的设计中,如果责任划分的不清晰,使用继承得到的结果往往是随着需求的变化,子类急剧膨胀,同时充斥着重复代码,这时候的关键是划清责任。 典型模式: Decorator Bridge 动机: 在某些情况下我们可能会“过度地使用继承来扩展对象的功能”,由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性;并且随着子类的增多(扩展功能的增多),...

sunshine_505的博客 137

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

学习《图说设计模式》装饰模式

图说设计模式之装饰模式 装饰者模式(Decorator Pattern)动态的给一个对象添加一些额外的职责。就增加功能来说,此模式比生成子类更为灵活。 1. 模式动机 一般有两种方式可以实现给一个类或对象增加行为: 继承机制,使用继承机制是给现有类添加功能的一种有效途径,通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法。但是这种方法是静态的,用户不能控制增加行为的方式和时机。 关联机制,即将一个类的对象嵌入另一个对象中,由另一个对象来决定是否调用嵌入对象的行为以便扩展自己的行为,我们称这

Orange_Wu的博客 434

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

学习、探究Java设计模式——装饰者模式

定义装饰者模式:在不改变原类文件以及不使用继承的情况下,动态地将责任附加到对象上,从而实现动态拓展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。设计原则要使用装饰者模式,需要满足以下设计原则: 1、多用组合,少用继承 2、开放-关闭原则:类应该对拓展开放,对修改关闭UML类图我们先来看看装饰者模式的类图,再来详细讲述: 由上自下: 1、Component是基类。通常是

蓝天白云梦的csdn博客 1万+

设计模式学习—03装饰模式

装饰模式 文章目录装饰模式UML解释说明代码实现参考资料 UML 解释说明 动态地给一个对象添加一些额外的职责。 在增加功能的方面上,装饰模式比生成子类更为灵活。 有效地把类的核心职责和装饰功能区分开。去除相关类中重复的装饰逻辑。 代码实现 Component.class package learn03; public abstract class Component { ...

Abfahrt的博客 202

【学习设计模式】装饰者模式

设计初衷:我们使用继承或组合来扩展对象的行为,但这是在编译时完成的,它适用于类的所有实例。我们无法在运行时添加任何删除任何现有行为的新功能 - 这就是Decorator模式出现的时候 假设我们想要实现不同种类的汽车 - 我们可以创建界面Car来定义组装方法然后我们可以拥有一辆Basic汽车,我们还可以将它扩展到跑车和豪华轿车。实现层次结构将如下图所示。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200731204429880.png?x-oss-process=

Jay的博客 157

装饰器设计模式学习

装饰器设计模式(Decorator Pattern)是一种结构型设计模式,允许你通过将对象包装在一个装饰器类中来动态地为对象添加新的功能。装饰器模式通常用于当需要扩展一个类的功能时,而不需要修改该类的源代码。它通过创建一个装饰器类来实现这一目标,并且可以将多个装饰器链式组合。Component(组件): 一个接口或抽象类,定义了被装饰对象的标准行为。(具体组件): 实现了Component接口的具体类,表示被装饰的对象。Decorator(装饰器): 一个实现了Component接口的抽象类,它。

QingTC 690

设计模式学习之装饰者模式

研究了一下装饰者模式,分享一下学习心得 在学习这个模式的时候上网查了一下相关的技术博客,大部分都只是实现但是对于这里的一些细节问题很少有去讲,一开始我也只是知道这么写会实现加强一些类的功能。为了彻底搞明白我打断点一步步调试。 首先有这样一个场景 我现在想画一幅人的画像 第一步 准备一张白纸 是空白的 第二部步画一个脸 技术不是很好,画的有点丑 第三步 脸有点黑,加点粉底吧 第四步...

tom有cat 230

装饰设计模式——学习篇

Android学习 装饰设计模式 装饰设计模式也称包装设计模式,用来动态的扩展对象的功能,也是继承关系的的一种替代方案之一。 通俗理解,在不使用的继承的方式下,采用装饰设计模式可以扩展一个对象的功能,可以使一个对象变得越来越强大。 下面通过一个Demo来理解下装饰设计模式 调用代码 PersonEat eat = new PersonEat(); //这是没有装饰过的 只能吃困穷菜 ea...

weixin_43850593的博客 164

Java23种设计模式之装饰者模式的学习

源码链接(Gitee码云):https://gitee.com/oldou/javadesignpatterns 这里有我整理好的Java23种设计模式的源码以及博客教程,博客教程中介绍了Java23种设计的模式的各种实现方式以及应用场景,非常适用于学习以及提高我们的设计思维,如果对大家有所帮助,请记得star一下给予作者一定的精神支持,你的star是我写出更好的博客的动力,谢谢大家。 装饰模式(decorator) 职责(作用) 动态的为一个对象增加新的功能; 装饰模式是一种用于替代继承的技术,..

weixin_43246215的博客 2397

设计模式之装饰模式学习

什么是装饰模式 装饰模式(Dec orator )模式又叫做包装模式。通过一种对客户端透明的方式来扩展对象的功能,是继承关系的一个替换方案。也就是说动态的给一个对象添加功能。 装饰模式的角色和职责 1、抽象组件角色:一个抽象接口,是被装饰类和装饰类的父接口。 2、具体组件角色:为抽象组件的实现类。 3、抽象装饰角色:包含一个组件的引用,并定义了与抽象组件一致的接口。 4、具体装饰角色:为抽象装饰...

Arrset的博客 314

设计模式学习、装饰器模式

先看下装饰器的UML图:抽象组件(Component):定义一个抽象接口,用于规范核心组件(Concrete Component)和装饰器(Decorator)共同遵循的接口。具体组件(Concrete Component):实现抽象组件接口,并定义了一个具有基本功能的对象。抽象装饰器(Decorator):继承或实现抽象组件接口,并且持有一个抽象组件实例,在内部可以通过调用抽象组件接口方法来完成基础功能,并在此基础之上添加新的功能。

dongdong199033的博客 741
上一篇: 设计模式学习——桥接模式
下一篇: leecode刷题学习——06 Z字形变换
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值