讲师中心 微信公众号
AI工具推荐 视频效率加速

Java代理模式与装饰模式的概念与实现

千瑶君_9083

千瑶君_9083

发布时间:2026-01-12 17:47:02

|

230人浏览过

|

来源于php中文网

原创

代理模式重在控制访问,装饰模式重在动态增强功能;代理强调替代性与单一控制点,装饰强调叠加性与正交增强,二者目的、场景及UML依赖关系均不同。

java代理模式与装饰模式的概念与实现

代理模式和装饰模式在 Java 中都属于结构型设计模式,表面看都用“包装”对象的方式扩展行为,但目的和使用场景截然不同:代理模式重在**控制访问**(比如权限校验、延迟加载、远程调用),装饰模式重在**动态增强功能**(比如给输入流加缓冲、给组件加边框)。

代理模式的核心是“替别人做事”,不是“帮别人加功能”

代理类与被代理类实现同一接口,代理类持有真实对象引用,在调用前后可插入逻辑,但不改变原有接口语义。常见错误是把代理写成“功能叠加器”,结果混淆了职责。

  • Proxy 类必须和 RealSubject 实现同一个 Subject 接口,否则无法透明替换
  • 静态代理需为每个被代理类手写一个代理类;动态代理(java.lang.reflect.Proxy)则通过 InvocationHandler 统一拦截
  • Spring AOP 默认使用 JDK 动态代理(要求目标类实现接口),若无接口则退化为 CGLIB 代理(生成子类),二者代理机制不同,final 类或方法无法被 JDK 代理
public interface Service {
    void execute();
}

public class RealService implements Service {
    public void execute() { System.out.println("real work"); }
}

public class LoggingProxy implements Service {
    private final Service target;
    public LoggingProxy(Service target) { this.target = target; }
    public void execute() {
        System.out.println("before");
        target.execute();
        System.out.println("after");
    }
}

装饰模式的关键是“同类型层层包裹”,支持运行时组合

装饰类与被装饰类实现同一接口,且持有被装饰对象引用,通过构造函数传入——这是它和代理最直观的代码相似点;但装饰模式的意图是让多个装饰器像俄罗斯套娃一样自由堆叠,每层只专注单一职责增强。

Bailian Usage Proxy
Bailian Usage Proxy

阿里百炼大模型平台多人共享账号用量统计代理服务。解决公司共用账号时无法区分个人用量的问题。适用场景:1)部署用量统计代理;2)统计多人Token用量和调用次数;3)管理大模型API调用配额。

下载
  • 装饰器必须继承/实现与被装饰对象相同的类型(通常是抽象类或接口),否则无法继续被下一层装饰
  • 不能出现“装饰器直接 new 具体实现类”的硬编码,应始终通过构造参数接收被装饰对象
  • Java I/O 包是经典案例:BufferedInputStream 装饰 FileInputStream,而它本身又可被 DataInputStream 装饰——顺序影响行为(如先缓冲再读数据,不能反过来)
public interface Coffee {
    String getDescription();
    double getCost();
}

public class SimpleCoffee implements Coffee {
    public String getDescription() { return "Simple coffee"; }
    public double getCost() { return 2.0; }
}

public class Milk implements Coffee {
    private final Coffee coffee;
    public Milk(Coffee coffee) { this.coffee = coffee; }
    public String getDescription() { return coffee.getDescription() + ", milk"; }
    public double getCost() { return coffee.getCost() + 0.5; }
}

别把代理写成装饰,也别把装饰当成代理

一个典型误用:用装饰器做权限检查。这看似可行,但破坏了装饰的“正交增强”原则——权限不是业务功能的自然延伸,而是横切关注点,该由代理或 AOP 承担。反之,若用代理去实现多层日志+压缩+加密,就违背了代理“单一控制点”的定位,代码会迅速僵化。

立即学习“Java免费学习笔记(深入)”;

  • 代理适合处理与目标对象无关的通用逻辑(如事务、监控、RPC 序列化),且通常只有一层
  • 装饰适合业务相关的、可选的、可叠加的功能扩展(如格式化、过滤、缓存),且层数由运行时决定
  • 两者都依赖“接口一致”,但代理强调“替代性”,装饰强调“叠加性”;从 UML 类图看,代理是代理类→被代理类的单向依赖,装饰是装饰类→组件接口→被装饰类的环形依赖

真正难的是在需求模糊时判断:这个“包装”是为了管控访问,还是为了丰富能力?一旦方向错了,后续每加一层都会让维护成本翻倍。

热门AI工具

更多
讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

2751

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

497

2026.01.26

spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

2751

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

497

2026.01.26

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

3188

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

5129

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3849

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

486

2026.01.19

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

60

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn