Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >代理模式 教你:先领券 再消费!

代理模式 教你:先领券 再消费!

作者头像
浩说编程
发布于 2022-11-11 01:46:11
发布于 2022-11-11 01:46:11
21600
代码可运行
举报
文章被收录于专栏:Java经验之谈Java经验之谈
运行总次数:0
代码可运行

视频版 - 看着更方便:

哔哩哔哩(横板)👉 https://b23.tv/CvCn35C

小红书(竖版)👉 http://xhslink.com/GWMlCi

其实 代理模式 的思路非常好理解

"代理"这个词

我们在网购的时候应该经常会听到

比如:

“我们是 某某品牌的 代理商”

“你在我这里消费可以 领取优惠券 更便宜"

01 | 代理模式

所以代理模式就是说

我在 消费 某个方法的时候

不直接调用 方法所在类

而是通过中间的 代理类

在不改变原方法的基础上

对 原方法 增加额外的附加功能

这种"代理"的思想在实际开发中的典型应用就是 代码解耦

什么意思呢?

我们知道在开发中 除了 业务处理代码 还有一些 公共处理代码

像 记录日志......

这类代码其实完全没有必要和业务处理代码耦合在一起

所以可以应用 代理模式

将之解耦,放到代理类中

这样既不影响原方法

又能灵活的修改代理类

那接下来 我就以 记录日志 为例

演示一下 java应用 代理模式 的过程

02 | 静态代理

首先 定义一个消费接口以及它的实现类

其中包含一个“购物”方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//接口
public interface ProducerService{
    Product makeProduct();
}
//服务接口实现类
public class ProducerServicelmpl implements ProducerService{
    @Override
    public Product makeProduct(){
        Product product =new Product();
        return product;
    }
}

然后 创建代理类 同样实现消费接口

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//代理类
public class ProducerServiceProxy implements ProducerService{
    //实例化被代理类
    private ProducerService productService=new ProducerServicelmpl();
    @Override
    public Product makeProduct(){
        //原方法
        Product product=productService.makeProduct();
        //日志记录逻辑代码
        .....
        return product;
    }
}

在代理类中先实例化原来的实现类,也就是被代理类

接着重写 “购物”方法

在方法中 调用原"购物"方法的同时

增加额外的 日志记录 或其它功能

这样就实现了代理模式的一种

叫做 静态代理

静态代理的意思是

我们需要在代码编译运行之前预先创建好代理类

也就是说 如果我有十个类需要 记录日志

那就要预先写好十个代理类

这显然不是好的实现方式

于是引出了另一种代理模式的实现 动态代理

03 | 动态代理

动态代理的思路是

不需要预先写好代理类

而是编写一个公共的 代理配置类

然后在需要创建代理的时候

将 被代理类作为参数 传给 代理配置类

由代理配置类生成对应的 代理类

来看具体代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//定义公共代理配置类
public class ProxyHandle implements InvocationHandle{
    private Object prtoBeProxyService;
    //构造函数
    public ProxyHandle(Object toBeProxyService){
        this.toBeProxyService=toBeProxyService;
    }
    @Override
    public Object invoke(Object proxy,Method method,Object args) throws Throwable {
        //执行原方法
        Object invoke =method.invoke(subject,args)
        //日志记录逻辑代码
        .....
        return invoke;
    }
}

首先 创建一个 代理配置类

注意 它和普通类的区别是

必须实现 InvocationHandler 接口

它是java实现动态代理的关键

我们继续看里面的代码

先用构造函数来初始化被代理的对象

这里涉及一个知识点

Object 是 所有类的默认父类

也就是说下面这个等式是成立的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class A{} = class A extends Object{};

所以 Object 可以接收任何类对象

接着重写 InvocationHandler 的 invoke方法

当我们调用原方法的时候

会被转发到这个方法中

所以这里就是我们对原方法进行功能扩展的地方了

其中入参

proxy 表示生成的代理类

method 表示原方法对象

args 表示原方法需要的参数

这就是 代理配置类 的代码了

接着我们看一下 调用动态代理 的示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//实例化服务
ProducerService producerService=new ProducerServicelmpl();
//创建代理配置类
ProxyHandle proxyHandle=newProxyHandle(producerService);
//生成代理类
ProducerService proxylnstance=(ProducerService)Proxy.newProxyinstance(
    producerService.getClass().getClassLoader()
    ,producerService.getClass().getinterfaces()
    ,proxyHandle);
//调用方法
proxylnstance.makeProduct()

1、先创建被代理类实例

2、将被代理类作为入参,创建 代理配置类 实例

3、调用 Proxy 类的 newProxyInstance 方法创建代理类

这个Proxy类 是用来创建 代理类 的一个工具类

4、拿着上一步生成的动态代理类,调用目标方法

这个时候就会进入 代理配置类 的invoke方法执行代理逻辑

总结一下动态代理的实现

重写 InvocationHandler 的 invoke方法

然后调用 Proxy 工具类 创建代理对象

以上是基于 接口 来实现的动态代理(由jdk提供)

你可以看到必须要实现接口

04 | cglib

而另一种不基于接口的实现方式叫做: cglib

cglib 是一款开源的代码生成类库

可以动态的为普通类生成代理

所以在spring 中

如果目标类实现了接口,则使用jdk的方式来实现动态代理

如果没有实现接口,则使用cglib的方式来实现

我是浩说

帮你入门到放弃

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-07-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 浩说编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
设计模式-代理模式
官话上讲是一种设计模式,目的是希望代码重用。跟我们以往访问对象的方式不同,代理模式不是直接通过目标对象,而是通过代理访问我们的目标对象以及方法。因为有的时候我们无法直接与目标对象建立联系或者,我们要控制客户端访问。所以便通过代理来访问我们的真实对象。
码哥字节
2020/03/24
3810
设计模式-代理模式
设计模式的通俗理解--代理模式
我在上一篇文章收尾部分提到过,设计模式按照功能性分为三类:创建类、结构类、行为类。创建类设计模式应用于创建对象这一步,包含工厂模式、单例模式、建造者模式、原型模式,通过之前的四篇文章已经全部介绍完。
浩说编程
2021/08/17
2980
设计模式的通俗理解--代理模式
Java设计模式:代理模式的静态和动态之分(八)
码到三十五 : 个人主页 心中有诗画,指尖舞代码,目光览世界,步履越千山,人间尽值得 !
公众号:码到三十五
2024/04/09
1440
Java设计模式:代理模式的静态和动态之分(八)
Spring AOP基础之代理模式.静态代理和动态代理
一、代理模式介绍 代理模式是一种设计模式,提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。 简言之,代理模式就是设置一个中间代理来控制访问原目标对象,以达到增强原对象的功能和简化访问方式。
张哥编程
2024/12/13
1730
Spring AOP基础之代理模式.静态代理和动态代理
一篇文章搞懂代理模式
代理模式的定义:代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。通俗点说,就是一个中介,比如有一个广州人,是个本地人,有两套房,他要租出去收租,但是除了收租,他还要去找租客,带租客看房,还要准备租房合同,核算水电费等等,很麻烦。这个本地人他也不想这么折腾,他只想完成他的核心业务(收钱),其他杂七杂八的事情就不想管,但是总要有人去做,那就找租房中介,也就是二手房东。二手房东就代理这个广州本地人把房子租给租客。这个道理就是这么简单。
java技术爱好者
2020/09/22
4400
设计模式之代理模式(结构型)
代理模式:代理模式就是引入一个代理对象,通过代理对象实现对原对象的引用。代理模式是一种对象结构型。
SmileNicky
2019/01/22
2850
代理模式 代理模式
1、远程代理:对一个位于不同地址空间的对象提供一个本地代表,隐藏这个对象存在于不同地址空间的事实,例如RMI的stub(RMI也是比较重要的概念)。这个不同的地址空间可以是在同一主机中,也可以是在不同主机中。
mingmingcome
2021/11/29
3830
代理模式
    





        代理模式
JAVA设计模式6:代理模式,用于控制对目标对象的访问
在代理模式中,代理对象充当了目标对象的中间层,客户端通过代理对象与目标对象进行交互。
Designer 小郑
2023/09/13
3590
JAVA设计模式6:代理模式,用于控制对目标对象的访问
代理模式
代理模式让我评价就是一个笑面虎,结构超简单,实现比较复杂。大家都知道代理模式深入咱们都业务代码中,(就是代理类把接口都实现类引入进来,然后加以封装,再由其他类使用代理类)应用场景太多了,但是大多都是静态代理,如果真都实现一个动态代理我认为还是一个比较都事情,本文对动态代理这块写对也是比较简单,
胖虎
2019/06/26
3650
代理模式
代理模式
代理设计模式是一种结构型设计模式,用于提供对象的替代品或占位符。在代理模式中,创建具有现有对象功能的对象,以向外部提供接口。代理控制着对原对象的访问,并允许在请求提交给对象前后进行一些处理。代理模式主要有三种形式:
JusterZhu
2023/10/06
1550
代理模式
不懂Nacos没关系,可以看看它是怎么运用代理模式的
看Nacos的源代码时,发现其中有对代理模式的运用,而且用得还不错,可以作为一个典型案例来聊聊,方便大家以更真实的案例来体验一下代理模式的运用。如果你对Nacos不了解,也并不影响对本篇文章的阅读和学习。
程序新视界
2022/12/27
4320
不懂Nacos没关系,可以看看它是怎么运用代理模式的
Java代理模式及动态代理详解
Java的动态代理在实践中有着广泛的使用场景,比如最场景的Spring AOP、Java注解的获取、日志、用户鉴权等。本篇文章带大家了解一下代理模式、静态代理以及基于JDK原生动态代理。
程序新视界
2020/03/24
5420
Java代理模式及动态代理详解
通俗易懂的讲解一下Java的代理模式
代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用(接口的引用)
李红
2019/06/18
4310
通俗易懂的讲解一下Java的代理模式
代理模式
代理模式又叫委托模式,是为某个对象提供一个代理对象,并且由代理对象控制对原对象的访问。代理模式通俗来讲就是我们生活中常见的中介。 代理模式可以提供非常好的访问控制,应用比较广泛。 举个例子来说明:假如说我现在想买一辆二手车,虽然我可以自己去找车源,做质量检测等一系列的车辆过户流程,但是这确实太浪费我得时间和精力了。我只是想买一辆车而已为什么我还要额外做这么多事呢?于是我就通过中介公司来买车,他们来给我找车源,帮我办理车辆过户流程,我只是负责选择自己喜欢的车,然后付钱就可以了。
用户10136162
2022/11/15
2610
代理模式
代理模式的运用
由于某些原因需要给某对象提供一个代理以**控制对该对象的访问**。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的**中介**。
忆愿
2024/08/07
1090
代理模式的运用
【java项目实战】代理模式(Proxy Pattern),静态代理 VS 动态代理
这篇博文,我们主要以类图和代码的形式来对比学习一下静态代理和动态代理,重点解析各自的优缺点。
程序猿小亮
2021/01/29
3210
代理模式的使用总结
(三)采用JDK代理实现:JDK动态代理实现InvocationHandler接口
全栈程序员站长
2022/08/10
3870
代理模式的使用总结
Java 代理模式的基本概念、使用场景、应用示例和实现方法
代理模式是一种常见的设计模式,在 Java 开发中被广泛应用。它允许我们通过添加一个代理对象来控制对另一个对象的访问,从而提供了一种间接访问实际对象的方法。本文将详细介绍 Java 代理模式的基本概念、使用场景、应用示例和实现方法等相关内容。
网络技术联盟站
2023/06/04
1.1K0
傀儡政权之代理模式
代理模式应用非常广泛,特别java领域的Spring框架,可以说把代理模式运用到极致。其中Spring的代理又分JDK动态代理和cglib动态代理。这类不打算深入讲解Spring的动态代理,而是深入讲解一下GOF 23的代理模式。
BUG弄潮儿
2020/12/17
3030
傀儡政权之代理模式
一文搞懂设计模式—代理模式
代理模式(Proxy Pattern)是一种结构型设计模式,也叫做委托模式,它允许你提供一个间接访问对象的方式。
BookSea
2024/02/29
2030
一文搞懂设计模式—代理模式
相关推荐
设计模式-代理模式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验