设计模式之装饰模式

设计模式——装饰模式 装饰模式是一种用来替代继承的思想,它使用对象之间的关联关系来取代类之间的继承关系。继承是一种常用的一种拓展原有类的功能的方法,通过创建一个继承父类的子类来拓展原有的功能,在“合成复用原则”中曾提到,在处理类的功能拓展这个问题上应尽量使用类之间的关联关系而少使用继承关系。为什么要用这个模式:以对客户透明的方式动态地给一个对象附加上更多的责任,装饰模式可以在不需要创造更多的子类的情况下,将对象的功能加... 阅读详情

什么是装饰模式

    装饰模式是指动态地给一个对象增加额外的职责,就增加对象功能来说,装饰模式比生成子类实现更加灵活。
    装饰模式是一种用于替代继承的技术,通过使用对象之间关联关系替代之前的父子类的继承关系。在装饰模式中引入装饰类,在装饰类中既可以调用原有方法,也可以增加新方法。
    装饰模式包含以下几个角色:
        Component(抽象构件):是具体构件和抽象装饰类的公共父类,声明了在具体构件中实现的业务方法。
        ConcreteComponent(具体构件):是抽象构件的子类,用于定义具体的对象,实现了抽象构件中声明的方法,装饰类可以增加额外的方法。
        Decorator(抽象装饰类):抽象构件的子类,用于给具体构件增加职责,具体职责在子类中实现。维护一个指向抽象构件对象的引用,通过该引用可以调用装饰之前构件对象的方法。
        ConcreteDecorator(具体装饰类):抽象装饰类的子类,负责增加新的职责,每一个具体装饰类都定义了新的方法,可以调用抽象装饰类中的方法,也可以增加新的方法。
    装饰模式也分透明装饰模式和半透明装饰模式:
        透明装饰模式:要求客户端完全针对抽象编程,不应该将对象声明为具体构件类型或具体装饰类。
        半透明装饰模式:当我们需要单独调用新增的业务方法时,就需要用具体装饰类型来定义对象。

装饰模式的优缺点

优点
  1. 对于扩展一个对象的功能,装饰模式比继承更加灵活,不会导致类的个数急剧增加。
  2. 可以通过动态的方式来扩展一个类的功能。
  3. 可以对一个对象进行多次装饰,通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合。
  4. 具体构件类与具体装饰类可以独立变化,用户可以根据需要增加新的具体构件类和具体装饰类,原有代码无需更改,符合开闭原则。
缺点
  1. 使用装饰模式会产生很多小对象,区别在于他们之间相互连接的方式不同,大量小对象会占用更多的系统资源,一定程度上影响程序性能。
  2. 装饰模式提供了比继承更加灵活的解决方案,但是比继承更容易出错。

装饰模式的应用场景

  1. 在不影响其他对象的前提下,以动态,透明的方式给单个对象添加职责。
  2. 当不能采用继承的方式对系统进行扩展时。

装饰模式的案例

// 抽象构件
@Data
public abstract class Drink {

    public String des;

    private float price = 0.0f;

    public abstract float cost();

}

// 具体构件
public class Coffee  extends Drink {
	@Override
	public float cost() {
		return super.getPrice();
	}
}

// 抽象装饰
public class Decorator extends Drink {
    private Drink obj;
    public Decorator(Drink obj) {
        this.obj = obj;
    }
    @Override
    public float cost() {
        return super.getPrice() + obj.cost();
    }
    @Override
    public String getDes() {
        return des + " " + getPrice() + " && " + obj.getDes();
    }
}

// 具体装饰
public class Milk extends Decorator {
	public Milk(Drink obj) {
		super(obj);
		setDes(" 牛奶 ");
		setPrice(2.0f);
	}
}

public static void main(String[] args) {
	Drink order = new Milk(order);
	System.out.println("order 加入一份牛奶 费用 =" + order.cost());
	System.out.println("order 加入一份牛奶 描述 = " + order.getDes());
}

在这里插入图片描述

装饰模式在源码中的应用

InputStream

public abstract class InputStream implements Closeable {
    public abstract int read() throws IOException;
    ......
}


public class FilterInputStream extends InputStream {
    public int read() throws IOException {
        return in.read();
    }
    ......

}

public class PushbackInputStream extends FilterInputStream {
    public int read() throws IOException {
        ensureOpen();
        if (pos < buf.length) {
            return buf[pos++] & 0xff;
        }
        return super.read();
    }

    public void unread(int b) throws IOException {
        ensureOpen();
        if (pos == 0) {
            throw new IOException("Push back buffer is full");
        }
        buf[--pos] = (byte)b;
    }   
    ......
}

STM32H743必要外围电路分析 写在前面:这篇博客是我第一次绘制STM32最小系统板的过程记录。 2020-1-11 BOOT STM32采用ARM内核,和ARM处理器一样,都有专门的boot脚决定单片机从何处启动。 在官方数据手册的第105页,我们可以看到 系统复位后,在SYSTICK的第四个上升沿锁存BOOT引脚的值,复位后,BOOT引脚可以由用户自由配置而不会影响系统正常运行。 BOOT引脚决定了自举存储器地址,当BO... 阅读详情

相关推荐

【MM小贴士】关于SAP系统中关税的处理方式

的运费,这部分来讲,我们关税的计价基础,就应该是货物价值+包邮到中国港口的运费,完后进行报关操作,缴纳关税,后半段从中国港口拉回到企业里面的运输费,就会做到费用里面去,而不是计入到存货成本。1、我们自己的企业和国外厂家A购买一项物资,厂家A的报价会分成几个组成部分货物本身的价值或者货物本身的价值+到国外港口的运费或者货物本身的价值+到中国港口的运费或者货物本身的价值+包邮到你们自己企业的整体运费。所以我的关税就是不确定的。重点是运费是哪一段的运费,如何结算,结算的货币,何时能够确定运费。.........

竹大的博客 9024

设计模式学习笔记(十二)装饰模式

1、动态地扩展对象的功能:可以在不修改原始对象的情况下,动态地给对象添加新的行为和功能。2、遵循开闭原则:通过对原始对象进行包装,实现了对扩展开放、对修改关闭的原则。可以轻松地新增装饰器类,而不需要修改已有的代码,提高了代码的可维护性和可扩展性。3、符合单一职责原则:装饰模式将功能划分到不同的装饰器类中,每个装饰器类只关注自己的特定功能,使得类的设计更加清晰,提高了代码的可读性和可理解性。4、避免使用子类的过多继承:通过组合多个装饰器对象来扩展功能,避免了使用过多的子类继承。

weixin_44917291的博客 388

三角洲行动交易行自动化脚本

DFMarketBot - 三角洲行动自动交易助手 DFMarketBot是一款专为三角洲行动游戏设计的交易行自动化工具,通过OCR识别和鼠标模拟实现自动补卡、补子弹功能。项目采用Python开发,支持Windows平台,主要功能包括: 自动检测并购买指定物品(房卡/子弹) 价格监控与智能购买(低于设定价格自动下单) 自定义购买数量与次数限制 支持窗口/无窗口两种游戏模式 使用前需安装Tesseract OCR引擎并配置游戏为1920*1080分辨率。通过JSON文件可灵活配置监控物品清单、理想价格和购买策

愤怒的阿木木的博客 3万+

【设计模式】装饰(器)模式 透明装饰模式与半透明装饰模式

装饰模式摘要 装饰模式是一种结构型设计模式,允许动态地为对象添加功能而不改变其结构或使用继承。它通过组合对象的方式扩展功能,比继承更灵活。该模式包含四个角色:抽象构件、具体构件、抽象装饰类和具体装饰类。典型应用场景包括Java I/O流系统、需要动态添加功能的系统以及替代多重继承的情况。以咖啡加料为例,装饰模式可以灵活组合各种配料而不需创建大量子类。代码实现时,装饰器类继承自同一抽象构件,并持有构件对象的引用,通过嵌套调用实现功能叠加。这种模式符合开闭原则,提高了系统的可扩展性和维护性。

weixin_44131922的博客 791

基于YOLOv11的水果/商品/食堂/蔬菜/饮料/书籍识别与计价系统,前台+后台管理系统

基于YOLOv11的水果/商品/食堂/蔬菜/饮料/书籍识别与计价系统,前台+后台管理系统

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1219

Python 爬虫实战:手机应用商店评论数据爬取与分析

移动应用市场蓬勃发展,用户的评论数据包含了大量有价值的信息,如用户满意度、功能反馈、改进建议等。通过分析这些评论,我们可以挖掘应用的优缺点,甚至预测用户趋势。由于 Apple App Store 评论是动态加载的,我们使用。本篇博客将详细介绍如何使用 Python 爬取。爬取大量数据时,可能会遇到反爬机制。库获取 Google Play 评论。评论数据是动态加载的,需要使用。

2201_76125261的博客 2322

扩展系统功能——装饰模式(四)

12.4 透明装饰模式与半透明装饰模式       装饰模式虽好,但存在一个问题。如果客户端希望单独调用具体装饰类新增的方法,而不想通过抽象构件中声明的方法来调用新增方法时将遇到一些麻烦,我们通过一个实例来对这种情况加以说明: 在Sunny软件公司开发的Sunny OA系统中,采购单(PurchaseRequest)和请假条(LeaveRequest)等文件(Documen

刘伟技术博客 1万+

Trae+雪球MCP,化身专业的股票分析师(玩转100个MCP系列第二弹)

大家好呀,我是程序员夏叶,深度AI编程使用者,专注于分享AI编程方面的使用技巧、经验以及前沿资讯,有兴趣的可以关注我的公众号,一起学习,共同进步。第二弹,使用Trae+雪球MCP,获取股票实时行情,分析股票走向等,写代码间隙看看股票价格,研究研究行情,哈哈。真的很不错呀,最关键的是,足够隐蔽,同事以为你在写代码,实际你在浏览股票行情,哈哈,感兴趣的可以试一下哦。说实话,沧州明珠这只股我算是砸手里了,不过还好买的不多,哈哈。

cpp加油站的专栏 518

设计模式之装饰模式详解(附应用举例实现)

设计模式之装饰模式详解(附应用举例实现)

pursuit的博客 5101

【异常】Claude Code 400错误(Extra inputs are not permitted)解决方案

摘要:Claude Code 2.0.37+版本因API请求包含未支持的custom.input_examples参数导致400错误,使核心功能失效。解决方案是降级至稳定版v2.0.32:先卸载当前版本(npm uninstall -g @anthropic-ai/claude-code),再安装指定版本(npm install -g @anthropic-ai/claude-code@2.0.32),最后验证请求是否恢复正常。该问题确认在v2.0.32版本不存在。(148字)

奶爸的编程之路,也就一周冷个三天 2038

【UVM实战】第七章:UVM中的寄存器模型(1)寄存器模型简介

寄存器模型简介~

悟已往之不谏 知来者之可追 2070

设计模式——装饰模式详解

装饰模式动态地给一个对象添加一些额外的功能,相对于继承的方式,更加灵活。 装饰模式经常被误认为是代理模式。装饰模式是以对客户透明的方式扩展对象的功能,是继承关系的一个替代方案。而代理模式则是给一个对象提供一个代理对象,并由代理对象来控制原有对象的引用。 前者重在增加功能,后者重在对代理对象施加控制,不是对对象本身功能的增强。...

关于Android开发的一些技术点总结 ╮( ̄▽ ̄”)╭ 1万+

42、多媒体与虚拟现实在艺术和影视领域的创新应用

本文探讨了多媒体与虚拟现实在艺术和影视领域的创新应用,涵盖三个典型案例:影视与人类学融合项目通过协作模式模糊作者与观众界限,推动文化文献的发展;交互式数字短片《分手》利用基于对象的广播技术探索个性化影视体验;威尼斯双年展瑞士馆4D项目则通过虚拟现实技术实现文化遗产的数字化展示。这些案例展示了技术在叙事、用户体验及文化保护中的深度应用,并展望了未来技术融合、个性化深化与文化遗产传承的发展趋势。

kappa的博客 114

设计模式---装饰模式(DesignPattern_Decorator)

摘录自:设计模式与游戏完美开发 十年磨一剑,作者将设计模式理论巧妙地融入到实践中,以一个游戏的完整实现呈现设计模式的应用及经验的传承 《轩辕剑》之父——蔡明宏、资深游戏制作人——李佳泽、Product Evangelist at Unity Technologies——Kelvin Lo、信仁软件设计创办人—— 赖信仁、资深3D游戏美术——刘明恺 联合推荐全书采用了整合...

su9257的博客 117

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

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

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

设计模式 | 装饰模式

1 | 装饰模式的概述 我们在了解装饰模式之前,先回顾下生活中的几个常见现象,举例如下: 新房的装修,房屋装修并没有改变房屋居住的本质,但可以让房屋变得更漂亮,更温馨,更实用,更满足居家需求。 相片的包装,照相馆中把原相片清洗出来后,会对上面做些包装/装饰,相片镀膜,添加相框等处理,让整体更加美观,防潮保存更长的时间。 在软件设计中,类似上面的场景我们也可以把对象在不改变结构的情况下对其加工扩展修饰,使得对象具有更加强大的功能,这种技术在设计模式中就叫装饰模式。装饰模式可以在不改变一个对象本身功能的基

ChaITSimpleLove的博客 4770

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

设计模式Python版 装饰模式

介绍了GOF设计模式中的装饰模式,用Python实现装饰模式的示例,以及装饰模式在Django中的应用。

分享、交流、合作 1284

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

设计模式——装饰模式(Decorator)

要想正确理解设计模式,首先必须明确它是为了解决什么问题而提出来的。 设计模式学习笔记 ——Shulin 转载请注明出处:http://blog.youkuaiyun.com/zhshulin 1、概念         装饰模式又名包装(Wrapper)模式。装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。         但是纯粹的装饰模式很难找到,大多数的装饰模式的实现

在路上 5万+

装饰模式——初学JAVA设计模式

文章目录一、基本概念模式角色二、简单实例实例一、变形金刚类图代码实现结果截图实例二、喜羊羊与灰太狼类图方式一:透明模式代码实现结果截图方式二:半透明模式+透明模式代码实现结果截图三、透明模式和半透明模式的区别辨析透明模式半透明模式四、小结优缺点适用场景 一、基本概念 装饰模式是一种用于替代继承的技术,它通过一种无须定义子类的方式来给对象动态增加职责,使用对象之间的关联关系取代类之间的继承关系。 装...

发子鸡的博客 1497

【设计模式】用Java实现装饰模式

装饰模式(Decorator Pattern)是一种结构型设计模式它允许在不改变现有对象结构的情况下,动态地将责任附加到对象上。装饰模式通过将对象包装在装饰器对象中,形成一条装饰链,每个装饰器对象都可以在被装饰对象的行为前后加上自己的行为。装饰模式的核心思想是通过组合而不是继承来扩展对象的功能。它遵循开放-关闭原则,即对扩展开放,对修改关闭,使得我们可以在不修改现有代码的情况下,灵活地添加新的功能。应用场景:需要在不改变现有对象结构的情况下,动态地为对象添加额外的功能。

分享Java硬核干货 1万+

Java设计模式-装饰模式

装饰模式是一种非常有用的设计模式,它可以动态地为对象添加新的功能,而不需要修改原有的代码。通过定义一个抽象的装饰器类和具体的装饰器类,我们可以非常方便地扩展对象的功能,以满足不同的业务需求。虽然装饰模式增加了代码的复杂性和运行时开销,但是它在许多情况下仍然是一种非常有效的解决方案。

小薯条的博客 703

设计模式-装饰模式

1.装饰模式的定义及使用场景定义:装饰模式也称为包装模式,结构型设计模式之一,其使用一种对客户端透明的方式来动态地扩展对象的功能,同时它也是继承关系的一种替代方案之一。动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活使用场景: 需要扩展一个类的功能,或给一个类增加附加功能 需要动态地给一个对象增加功能,这些功能可以再动态地撤销 需要为一批的兄弟类进行改装或加装功能,当

黄俊彬 1627
上一篇: 设计模式之组合模式
下一篇: 设计模式之外观模式
geek-wmy
博客等级 码龄9年 322粉丝 126原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值