一文区分 装饰器模式 vs 代理模式
快速判断想控制能不能调用权限、延迟创建→代理想给对象叠加额外功能可以自由多层套 →装饰器核心区分代理模式控制访问代理对象代替原始对象干活可以做权限、日志、延迟加载控制访问装饰器模式动态增强功能给原有对象叠加额外行为不控制访问只是加附加逻辑。两者结构非常像都包装目标对象实现同一个接口但是意图完全不同。1. 代理模式Proxy Pattern意图为目标对象提供一个代理对象由代理控制对目标对象的访问。 常见类型静态代理、动态代理 (JDK/CGLIB)、远程代理、虚拟代理。适用场景权限控制访问目标对象前校验登录 / 权限无权限直接拦截不调用真实对象延迟加载虚拟代理大对象图片、重型服务需要的时候才创建真实对象远程代理访问远程服务RPC代理封装网络调用细节日志 / 埋点次要但重点是代理接管访问入口特点代理类和目标类是一对一一般提前确定代理谁不能随意多层叠加。Java 静态代理示例// 统一接口 public interface UserService { void addUser(); } // 真实对象 public class UserServiceImpl implements UserService { Override public void addUser() { System.out.println(【真实对象】新增用户); } } // 代理对象控制访问 public class UserServiceProxy implements UserService { // 持有真实对象 private UserService target; public UserServiceProxy(UserService target) { this.target target; } Override public void addUser() { // 代理访问控制权限校验 System.out.println(【代理】校验权限); if (checkPermission()) { target.addUser(); // 通过校验才访问真实对象 System.out.println(【代理】操作后记录日志); } else { System.out.println(【代理】权限不足禁止访问); } } private boolean checkPermission() { return true; } } // 测试 public class TestProxy { public static void main(String[] args) { UserService target new UserServiceImpl(); UserService proxy new UserServiceProxy(target); proxy.addUser(); } }输出【代理】校验权限 【真实对象】新增用户 【代理】操作后记录日志典型业务Spring AOP 底层就是动态代理用来拦截方法做事务、权限。2. 装饰器模式Decorator Pattern意图动态给对象增加额外职责不需要修改原类。装饰器本身也实现同一个接口可以多层嵌套叠加。核心包装后原有对象能力增强不是控制访问。适用场景IO 流BufferedReader装饰FileReader、DataOutputStream装饰FileOutputStream经典案例咖啡订单基础咖啡可以动态加牛奶、糖、巧克力任意组合叠加UI 组件窗口可以动态增加滚动条、边框特点可以无限多层装饰叠加装饰器的目的是扩展功能不是拦截访问。Java 示例咖啡// 公共抽象组件 public abstract class Coffee { public abstract String getDesc(); public abstract double getPrice(); } // 基础对象美式咖啡 public class Americano extends Coffee { Override public String getDesc() { return 美式咖啡; } Override public double getPrice() { return 15; } } // 装饰器抽象类继承Coffee持有Coffee对象 public abstract class CoffeeDecorator extends Coffee { protected Coffee coffee; public CoffeeDecorator(Coffee coffee) { this.coffee coffee; } } // 具体装饰器加牛奶 public class MilkDecorator extends CoffeeDecorator { public MilkDecorator(Coffee coffee) { super(coffee); } Override public String getDesc() { return coffee.getDesc() 牛奶; } Override public double getPrice() { return coffee.getPrice() 3; } } // 具体装饰器加糖 public class SugarDecorator extends CoffeeDecorator { public SugarDecorator(Coffee coffee) { super(coffee); } Override public String getDesc() { return coffee.getDesc() 糖; } Override public double getPrice() { return coffee.getPrice() 1; } } // 测试 public class TestDecorator { public static void main(String[] args) { // 基础咖啡 牛奶 糖多层嵌套装饰 Coffee coffee new Americano(); coffee new MilkDecorator(coffee); coffee new SugarDecorator(coffee); System.out.println(coffee.getDesc() 价格 coffee.getPrice()); } }输出美式咖啡 牛奶 糖价格19.03. 对比总结表维度代理模式装饰器模式核心意图控制 / 管理对目标对象的访问动态增强对象功能叠加附加行为组合关系代理包装目标一般一对一很少多层嵌套装饰器可以无限多层嵌套自由组合新增能力代理本身不新增业务能力只是拦截、校验、转发装饰器新增功能缓冲、配料典型案例Spring AOP 动态代理、RPC 远程代理Java IO 流、咖啡配料使用者视角使用者拿到代理感知不到真实对象存在使用者依然操作原对象一层一层叠加增强

相关新闻

【ICRA 2026】VeriGraph:以场景图为可验证中间表示的机器人任务规划|从具身大模型规划验证视角

【ICRA 2026】VeriGraph:以场景图为可验证中间表示的机器人任务规划|从具身大模型规划验证视角

摘要 本文解读 ICRA 2026 论文《VeriGraph: Scene Graphs for Execution Verifiable Robot Planning》。该论文提出以场景图作为可执行验证的中间表示,通过融合场景图结构化表示、图编辑式动作建模与迭代式约束校验,让机器人在真正动手之前先证明计划做…

2026/10/9 2:56:49 阅读更多 →
《创业之路》-1024-细读商业经典 - AI 是一个普惠技术,其技术本身带来的原始创新能力,正在颠覆美国在原始创新上的优势。

《创业之路》-1024-细读商业经典 - AI 是一个普惠技术,其技术本身带来的原始创新能力,正在颠覆美国在原始创新上的优势。

AI 普惠时代:正在重构而非颠覆的全球创新格局这个判断切中了 AI 作为通用目的技术(GPT)最核心的革命意义:它不是一项普通的新产品,而是一种全新的创新生产工具 —— 它直接降低了 “原始创新” 的门槛,稀释…

2026/10/9 2:56:49 阅读更多 →
你不是记不住单词,只是没找到对的方式

你不是记不住单词,只是没找到对的方式

你有没有过这样的瞬间?深夜翻开单词书,abandon 那一页已经快被翻烂了,可后面的单词还是陌生得像第一次见。或者,明明背了一下午,合上书的那一刻,脑子里只剩下“马冬梅”三个字。我懂。那种挫败感&#xff0…

2026/10/9 2:56:49 阅读更多 →

最新新闻

双指针算法全攻略:对撞、快慢、滑动窗口三大模板与实战总结

双指针算法全攻略:对撞、快慢、滑动窗口三大模板与实战总结

刷题刷到一定量,很多人会慢慢总结出一条规律:有一类题的解法特别“固定”——有序数组里找两个数凑目标值、链表中判断有没有环、字符串里找不重复的最长子串,题面长得完全不一样,翻开题解一看,底层全是同一个思路&…

2026/10/9 3:32:13 阅读更多 →
医疗NLP实战:词典构建与最大匹配实体标注

医疗NLP实战:词典构建与最大匹配实体标注

简介:一套基于Python与Jupyter构建的医疗实体识别模型资源,面向疾病、症状、身体部位三类实体,完整呈现词典构造、语料标注、模型训练与结果评估的工程化流程。压缩包共147个文件,约581MB,具体包含18个txt词典/文本、1…

2026/10/9 3:32:13 阅读更多 →
Git远程分支覆盖本地分支:reset、clean实操与急救指南

Git远程分支覆盖本地分支:reset、clean实操与急救指南

1. 什么时候需要“用远程分支覆盖本地分支”先聊个真实的场景。我在维护一个项目时,远程仓库里develop分支已经被同事 rebase 重新整理过,提交历史完全换了样子。我本地还停在老版本上,这时候直接git pull会提示分叉严重,甚至直接…

2026/10/9 3:32:13 阅读更多 →
Cache模拟器实战:从映射原理到命中率计算的完整工程解析

Cache模拟器实战:从映射原理到命中率计算的完整工程解析

简介:一份面向计算机组成原理与操作系统学习者的缓存模拟器源码,在Visual Studio 2010环境下编写,通过读取地址流文件模拟处理器访存行为,可设置缓存容量、块大小,并支持直接映射、组关联映射、全关联映射三种策略&…

2026/10/9 3:32:13 阅读更多 →
Servlet配置实战:web.xml与@WebServlet注解全面解析

Servlet配置实战:web.xml与@WebServlet注解全面解析

Servlet这个词,放在今天动辄微服务、云原生的大环境下,多少有点“老古董”的感觉。但你只要还在写Java后端,不管用Spring Boot还是Spring MVC,请求真正进来之后,最终处理的还是Servlet容器那一层。很多新人会直接跳过S…

2026/10/9 3:32:13 阅读更多 →
Claude Code与桌面版安装教程:环境配置、VS Code插件及MCP部署

Claude Code与桌面版安装教程:环境配置、VS Code插件及MCP部署

最近一直被同一个问题刷屏:“Claude到底怎么装?”尤其是Claude Code这三个月火起来之后,各大群里问安装的比问用法的还多。我前前后后帮朋友远程装过几十次,也踩了不少坑——什么安装到一半卡死、装完打开白屏、输入命令提示找不到…

2026/10/9 3:31:13 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 10:10:36 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 13:34:55 阅读更多 →