再议:装饰器模式和代理模式的区别

设计模式第五讲-装饰器模式和代理模式详解 (1). 定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。(2). 优点:A. 采用装饰模式扩展对象的功能比采用继承方式更加灵活。B.可以设计出多个不同的具体装饰类,创造出多个不同行为的组合。(3). 缺点装饰模式增加了许多子类,如果过度使用会使程序变得很复杂。(1). 定义:由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。 阅读详情
在典型的例子上,两者是非常好区分的。如spring的AOP、远程代理类、JDK的proxy,都是代理模式。JDK里的输入/输出器是很典型的装饰器模式! 
但在有些场景上,对设计模式入门的新手,还是有点难区分,我曾经也一度为此困惑。 
两个模式的UML类图基本没区别,都是实现同一个接口,一个类包装另一个类。 

两者的定义 
装饰器模式:能动态的新增或组合对象的行为。 
代理模式:为其他对象提供一种代理以控制对这个对象的访问. 
装饰模式是“新增行为”,而代理模式是“控制访问”。关键就是我们如何判断是“新增行为”还是“控制访问”。 

来看一个例子 
之前设计的搜索引擎检索模块: 

 

Searcher:检索类接口 
IllegalKeywordFilterSearcher:非法关键词过滤检索类,即如果搜索关键词里包含非法关键词,直接返回空结果集。 
CachedSearcher:缓存检索类,相同检索条件缓存已经有数据,返回缓存里的结果集。 
DistributedSearcher:分布式检索类,调用多台服务器的检索服务,然后合并最终的结果集。 
LocalSearcher:本地检索类,只能从当台服务器上检索结果 
HightLightSearcher:高亮检索类,操作结果集,找到跟搜索条件最相关的片段,并且关键词上高亮。 

其中HightLightSearcher很明显是装饰类,新增了高亮的行为。 
CachedSearcher是代理类,可能也没疑义,因为可能听说过“缓存代理”的说法。 

IllegalKeywordFilterSearcher就不好确定是代理类还是装饰类,可以理解是控制访问,也可以理解成是新增行为,毕竟它是业务需求,总觉得业务需求应该属于行为。 

看了这篇文章之后 difference-between-decorator-and-proxy-patterns 就非常明确了。 

原句:I think we’re all aware that the decorator pattern is used to add behavior to existing code. This does not stop at one kind of behavior but any number of different things that we want to do. 
意译:装饰类只能新增行为,不能跳过其他的任何一个行为。 

IllegalKeywordFilterSearcher如果检测到有敏感关键词,就直接返回空结果了,不会再调用其他检索类了,所以不是 
装饰类,而是代理类。 

当然,有些类可能既有控制访问的逻辑,也有新增行为逻辑。比如高亮和缓存整合在一个类里,但是违反了单一职责原则,觉得也没讨论的必要。 

网上已经有很多关于两者区别的文章,但是评判的标准的都不是非常明确,我不知道大家有没有类似的困惑。 
AI大模型开发——transformer模型超全完整版(0基础可懂) 为了更深入的了解transformer模型,我们首先从transformer的诞生聊起吧。transformer在2017年由Vaswani等人首次提出,它摒弃了之前流行的循环神经网络和卷积神经网络的架构,引入了自注意力机制( Self-Attention),显著提高了处理序列数据的能力和效率。transformer模型的这种设计使其在处理长距离依赖问题时, 相比于传统的循环神经网络和长短期记忆网络(LSTM)表现得更加出色,至此, 开启了NLP技术的新篇章。 阅读详情

相关推荐

基于DPABI和SPM12的任务态fMRI分析笔记1——预处理

前言 原理简介 预处理

Sophia2023的博客 1万+

代理模式和装饰器模式的区别

代理模式和装饰器模式的区别

weixin_43442127的博客 1801

Windows系统监控实战:Grafana+Prometheus+node_exporter保姆级配置指南(含常见问题解决)

本文提供了一份详尽的Windows系统监控实战指南,详细讲解了如何从零部署Grafana、Prometheus和node_exporter(实际为windows_exporter)监控栈。内容涵盖核心组件认知、分步配置解析、高级生产环境考量,并重点针对配置过程中常见的“No Data”问题提供了系统性的排查手册,旨在帮助用户快速搭建稳定可靠的系统资源监控平台。

weixin_29197835的博客 1008

代理模式和装饰器模式区别

代理模式与装饰器模式有何区别? 我想有必要对此问题谈一下我的个人理解,若有误导的之处,还请大家指正! 代理模式(Proxy 模式)可理解为:我想做,但不能做,我需要有一个能干的人来帮我做。 装饰器模式(Decorator 模式)可理解为:我想做,但不能做,我需要有各类特长的人来帮我做,但我有时只需要一个人,有时又需要很多人。 它们的区别就是,Proxy 模式需要的是一个能人,而 Decora...

luzhensmart的专栏 2158

别再手动配IP了!用NI-USRP Configuration Utility快速搞定USRP 2954与LabVIEW连接

本文详细介绍了如何使用NI-USRP Configuration Utility快速配置USRP 2954与LabVIEW的连接,解决传统手动IP配置的繁琐问题。通过图形化工具自动完成设备发现、IP设置和连接验证,大幅提升软件无线电实验效率,特别适合信号收发应用场景。

weixin_27102543的博客 292

第2章 数据库关系模型-单元测验-数据库原理及应用

第2章 数据库关系模型---数据库与机器学习 作业 常用的关系查询操作包括选择、投影、连接、并、交等。 v 实体完整性是指关系表的属性组成必须是完整的。 x 自然连接是一种等值连接。 v 在参照完整性中,可以定义级联操作。 v 用户自定义完整性可以实施数据的业务约束。 v 每个关系是一个二维表,但二维表不一定是关系。 v 关系中复合键至少包含两个属性。 v 代理键是为了唯一标识关系的不同元组,需要在表单或报表中显示出来。 x ...

aiqq136的博客 5723

什么是装饰器模式和代理模式,以及它们之间的区别?

一. 装饰器模式 概念:装饰器模式就是给一个对象动态的增加一些功能,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例。 类结构图: 代码理解: 1.先定义一个抽象接口Sourceable package com.sjms.decorator; public interface Sourceable { //自定义抽象方法 void method(); } 2.定义一个实现类Source 实现抽象接口Sour...

illovesoftware的博客 2837

ISCC-Amy‘s Code CTF-Reverse

ISCC-Amy's Code CTF-Reverse

m0_72904009的博客 682

代理模式与装饰器模式有何区别?

有一些争议,谈论的是设计模式中的代理模式和装饰器模式的区别,但笔者是非常赞同文章的观点的,有种豁然开朗的感觉。 以下是原文 代理模式与装饰器模式有何区别? 我想有必要对此问题谈一下我的个人理解,若有误导的之处,还请大家指正! 代理模式(Proxy 模式)可理解为:我想做,但不能做,我需要有一个能干的人来帮我...

qzns木雨的博客 1988

【开关电源篇】开关电源——只需这三个阶段,从电源小白到维修大神

🔌 该篇为的原创文章跳转目录,小二持续更新跳转链接,尽情关注!

2301_81299416的博客 2387

【测开求职】面试题:JAVA 吐血整理

本篇文章包含本次测开工程师秋招过程中遇到的所有JAVA面试题,全文两万字,亲测应对各个大厂的面试毫无压力👉

vector的博客 1211

C# 设计模式:装饰器模式与代理模式的区别

尽管装饰器模式和代理模式看起来很相似,都是通过包装对象来增强或控制对象的行为,但它们有不同的设计目的和使用场景。装饰器模式主要用于增强对象的功能,而代理模式则主要用于控制访问,尤其是延迟加载、权限控制等。理解这两者的区别,可以帮助我们在开发中做出更加合适的设计决策。在实际开发中,当你需要扩展对象的功能时,可以考虑使用装饰器模式;而当你需要控制对象的访问或者做一些额外的管理时,可以考虑使用代理模式。

玉面小浪君的博客 1480

在 SAP 系统中,成本中心(Cost Center)是成本核算与费用管控的基础组织单元,其设计质量直接决定了后续成本归集、分摊、分析及责任考核的准确性

SAP系统成本中心设计核心要点:1. 设计原则包括责任可控、业务同质、核算颗粒度适配、组织对齐及稳定性平衡;2. 划分维度主要有部门、功能、地域、项目和资产5类,可组合使用;3. 需避免颗粒度过细、跨责任主体归集等常见误区;4. 建议采用"明确目标-梳理业务-设计编码"三步法,建立科学的成本中心体系。合理的成本中心设计能精准归集费用、明确责任主体,为成本分析和管控奠定基础。

金牌架构师 1437

装饰器模式和代理模式的区别

学习AOP时,教材上面都说使用的是动态代理,可是在印象中代理模式一直都是控制访问什么的,怎么又动态增加行为了,动态增加行为不是装饰器模式吗?于是找了很多资料,想弄清楚这两者之间到底有什么区别。结果发现这一篇英文文章讲的很清晰,就翻译一下,供参考。

book_arrow的专栏 2069

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Java设计模式(六)装饰器模式-与代理模式的区别-项目实战应用

装饰器模式(Decorator Pattern): 在不改变对象自身的基础上,在程序运行期间给对象动态的添加职责;感觉有点儿类似于继承,不改变父类,子类可拓展功能; 和代理模式(代理设计模式) 真是太像了,简直一摸一样场景: 项目一期开发的时候,并没有给鉴权部分设置缓存;二期开发考虑到性能问题,想要给鉴权部分加上缓存,这里就选择了使用装饰器模式处理...

孔明的博客 3967

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Java学习-设计模式-装饰器模式和代理模式的区别

Java学习-设计模式-装饰器模式和代理模式的区别 区别: **装饰器模式: ** 关注于在一个对象上动态的添加方法。当我们使用装饰器模 式的时候,我们通常的做法是将原始对象作为一个参数传给装饰者的构造器。 **代理模式: ** 关注于控制对对象的访问。用代理模式,代理类(proxy class)可以对它的客户隐藏一个对象的具体信息。因此,当使用代理模式的时候,我们常常在一个代理类中创建一个对象的...

xxydzyr的博客 1800

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

从一碗小米粥谈装饰器模式,代理模式的区别

代理与装饰器 场景描述 代理即代替意思,可替代原类的所有功能,即和原类实现相同的规范。代理模式和装饰器模式很像。 每天清晨起来,紧张的洗漱之后,来到楼下的早餐店,我通常都会要一碗小米粥,这时候盛粥的大姐姐通常会问一句加不加糖,我回答不加,这时候我就会得到一碗热腾腾香喷喷的小米粥。 基础实现 一个小米粥的接口: publicinterface MilletCon...

AlbertYang的博客 2237

装饰器模式和代理模式

1、装饰器模式:动态地给一个对象添加一些额外的职责。重点是调用者主动给目标对象动态新增功能 2、代理模式:为其他对象提供一种代理以控制对这个对象的访问。重点是调用者不用知道目标对象是什么,是怎么创建的,只需要告诉代理对象自己需要什么。 实现方式: a、装饰器模式: 1、新增一个接口,接口就一个方法表示要向数据库插入数据 public interface DB { /** * 向数据库中插入一个记录 * @param value */ void ..

xiaxiaoying的专栏 2012
上一篇: 装饰模式与代理模式的区别
下一篇: LINUX 环境下 NIO MMAP和DirectMem性能的比较
大树叶
博客等级 码龄12年 1171粉丝 664原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值