谈谈代码:漫谈代理模式

简介: 代理模式是在编程中非常常见的设计模式.笔者在面试的过程中也经常会问到相关的问题,但是很多同学答的并不尽人意
版本 日期 备注
1.0 2019.4.27 文章首发
1.1 2021.5.21 修改标题:漫谈代理模式-> 谈谈代码:漫谈代理模式

前言

代理模式是在编程中非常常见的设计模式.笔者在面试的过程中也经常会问到相关的问题,但是很多同学答的并不尽人意.在这篇文章中,笔者想和大家聊聊代理模式的应用及一些实践.

What

先来一张图

我们可以很明显的看到,代理和客户端发生了耦合,而目标端则与客户端解耦.

Why

上文提到了一点,松耦合.而在任何设计模式中,他们的目的都在以下范围内:

  1. 减少代码冗余度,提高代码复用性
  2. 松耦合

这里提到了代码的复用性,也可以多嘴一句,代理模式可以帮助我们实现The Open Closed Principle.

在这里,我们可以举一个例子.Target可能是一位不错的程序员,client是一家公司.在整个招聘流程中,如果Proxy是猎头,有些猎头则可能会想办法帮程序员提高身价.而如果Proxy是Hr,则可能会来杀杀价.而程序员走的流程可能一直是一样的:

  1. 电面
  2. 到面
  3. 签合同

我们可以把不同的行为(讨价还价的特殊技巧)写在不同的Proxy里(HrProxy or 猎头Proxy),而我们的程序员只要专心走流程就行了.

How

以Java中最常用的框架——Spring为例.Spring最主要提供了2个功能:

  • IOC(Inversion of Control)
  • AOP(Aspect Oriented Programming)

而我们知道,Spring的AOP本质上是通过代理模式来做的.接下来我们来详细聊聊Spring提供的4种类型的AOP支持:

  • 基于代理的经典Spring AOP;
  • 纯POJO切面;
  • @AspectJ注解驱动的切面;
  • 注入式AspectJ切面(适用于Spring各版本)。

前三种都是Spring AOP实现的变体,Spring AOP构建在动态代理基础之上,因此,Spring对AOP的支持局限于方法拦截。

而SpringAOP支持两种模式的动态代理,JDK Proxy和cglib.当Spring发现目标被代理类实现就接口时,则用JDK Proxy来实现.

  • JDK Proxy不完全通过反射来做,也有ASM进行字节码操作的.本质是通过接口约定来做的
  • cglib完全通过ASM字节码来做.本质通过继承的方式实现

代码大概长这样:

//spring aop 生成的代理
public class SpringAopTargetProxy extends Target{
    public void  operate(){
            //spring aop method1...
            super.operate();
           //spring aop method2...
    }
}

而AspectJ是通过编译时编织来做的,即在编译时插代码进去.所以可以认为它基于静态代理来做AOP.

基于以上,我们也可以推导出SpringAOP对于finalorstatic方法是无效的.

callexecution有什么区别呢?

  • call就是在调用这个方法的地方插入代码
  • execution就是在调用这个方法的前面插入代码

代理模式的变化形式

之前,我们根据代理生成的时机来区分了静态代理和动态代理.而根据使用方式,常见则有两类:

  • Virtual Proxy:只有当真正需要实例时,它才生成和初始化实例
  • Remote Proxy:远程代理可以让我们不必关心RealSubject角色是否在网络上,而是像调本地方法一样调用它的方法.Java的RMI(Remote Method Invocation)就相当于远程代理.

类似的设计模式

Adapter

Adapter模式适配了两种具有不同接口(API)的对象,以使它们可以一同工作。而在Proxy模式中, Proxy角色与RealSubject角色的接口(API )是相同的(透明性)。

Decorator

Decorator模式与Proxy模式在实现上很相似(比如API的一致性),不过它们的使用目的不同——Decorator模式的目的在于增加新的功能。而在Proxy模式中,与增加新功能相比,它更注重通过设置代理人的方式来减轻本人的工作负担.

目录
相关文章
|
4月前
|
索引 Perl
awk高级用法——内置变量、函数与进阶技巧
本文深入讲解awk进阶核心:内置变量(NR/FNR/NF/FS/OFS/FILENAME/ARGC/ARGV等)与内置函数(length/substr/index/gsub等),涵盖行字段统计、多文件处理、动态分隔符、字符串操作等高频场景,配丰富实操示例,助你从入门迈向精通。
|
6月前
|
人工智能 自然语言处理 安全
性价比高的智能客服系统推荐(2025年12月更新)
在数字化时代,智能客服已成为提升客户体验的核心。本文对比瓴羊Quick Service、合力亿捷云客服、Intercom、Freshdesk、Zendesk五大主流产品,从功能、AI能力、部署模式、行业适配等维度深入分析,结合企业规模与业务需求,提供科学选型建议,助力企业实现服务智能化升级,降本增效。
|
7月前
|
人工智能 编解码 监控
《AV1解码生态全景图》,迄今最全面的AV1解码生态报告
截至2025年11月最完整详尽的 AV1 解码生态全景报告
|
9月前
|
PHP 芯片 C++
基于TMS320F28377D双核芯片的开发例程
基于TMS320F28377D双核芯片的开发例程
|
监控 机器人 API
Spug推送平台:开发者的消息推送神器
Spug推送平台:开发者的消息推送神器 作为开发者,一行代码搞定全渠道推,Spug推送助手场景化功能指南
570 1
|
网络协议 安全 网络安全
|
API
观音灵签免费API接口教程
该API提供观音灵签的随机获取服务,含100签,支持POST/GET请求。需用户ID和KEY认证。返回签文、解曰、典故等信息。示例请求:https://cn.apihz.cn/api/mingli/guanyin.php?id=88888888&key=88888888。详情参见官方文档。
680 7
|
机器学习/深度学习 数据采集 算法
监督学习工作流程:从数据准备到模型部署
本文详细介绍了监督学习的工作流程,涵盖数据准备、模型选择、训练、评估与优化、部署等关键步骤,并结合具体代码示例,帮助读者全面掌握监督学习在实际项目中的应用方法。从数据收集、清洗到特征工程,再到模型训练与评估,最后部署模型,每个环节都提供了详细的指导和实践建议。适合初学者和有一定基础的读者深入学习。
1131 2
|
数据采集 分布式计算 OLAP
最佳实践:AnalyticDB在企业级大数据分析中的应用案例
【10月更文挑战第22天】在数字化转型的大潮中,企业对数据的依赖程度越来越高。如何高效地处理和分析海量数据,从中提取有价值的洞察,成为企业竞争力的关键。作为阿里云推出的一款实时OLAP数据库服务,AnalyticDB(ADB)凭借其强大的数据处理能力和亚秒级的查询响应时间,已经在多个行业和业务场景中得到了广泛应用。本文将从个人的角度出发,分享多个成功案例,展示AnalyticDB如何助力企业在广告投放效果分析、用户行为追踪、财务报表生成等领域实现高效的数据处理与洞察发现。
1227 0
|
存储 安全 算法
密码学原理及其在网络安全中的应用
【7月更文挑战第27天】密码学作为保护信息安全的基石,在网络安全中发挥着不可或缺的作用。通过加密、解密、身份验证、数字签名和哈希函数等技术手段,密码学确保了数据的机密性、完整性和认证性。随着计算能力的不断提升和密码分析技术的不断进步,密码学需要不断创新和发展,以应对新的安全挑战。未来,随着量子计算技术的兴起和后量子密码学的研究深入,密码学将在网络安全领域发挥更加重要的作用。

热门文章

最新文章