设计模式|代理模式

这篇具有很好参考价值的文章主要介绍了设计模式|代理模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

设计模式|代理模式

代理模式介绍

​代理模式指为其他对象提供一种代理,以控制对这个对象的访问。在某些情况下,一个对象若不能直接引用另一个对象,而代理对象可以在客户端与目标对象之间起到中介的作用。

设计模式|代理模式

代理模式使用场景

普通代理

普通代理模式是指在代理模式中,代理对象和真实对象都实现了相同的接口或继承了相同的抽象类。代理对象将请求转发给真实对象,并可以对请求进行一些额外处理。

普通代理模式由三个组成部分:抽象主题、具体主题和代理。

1. 抽象主题(Subject)定义了真实主题和代理之间共有的接口,客户端通过该接口访问真实主题和代理。

2. 具体主题(RealSubject)实现了抽象主题的接口,定义了真实的业务逻辑。

3. 代理(Proxy)实现了抽象主题的接口,并持有一个真实主题的引用。代理负责管理真实主题的创建、销毁和访问,并可以在访问真实主题前后添加一些额外的逻辑。

// 抽象主题interface Subject {  void request();}// 具体主题class RealSubject implements Subject {  @Override  public void request() {    System.out.println("RealSubject: Handling request.");  }}// 代理class Proxy implements Subject {  private RealSubject realSubject;  @Override  public void request() {    if (realSubject == null) {      realSubject = new RealSubject();    }    preRequest();    realSubject.request();    postRequest();  }  private void preRequest() {    System.out.println("Proxy: Preparing request.");  }  private void postRequest() {    System.out.println("Proxy: Cleaning up after request.");  }}// 客户端public class Client {  public static void main(String[] args) {    Subject proxy = new Proxy();    proxy.request();  }}

普通代理模式通过使用额外的代理层来控制对真实对象的访问,并可以在访问前后添加额外的处理逻辑,从而提供更多的控制和灵活性。

动态代理

动态代理模式是一种在运行时创建代理对象的机制,与普通代理模式相比,它更加灵活和通用。在动态代理模式中,代理类不需要预先定义,而是在程序运行时根据需要动态生成。

动态代理模式由以下两个要素组成:

1. InvocationHandler 接口:该接口定义了代理类需要实现的方法,即代理类在处理方法调用时需要进行的操作。代理类通过实现 InvocationHandler 接口来自定义对被代理对象方法的调用规则。

2. Proxy 类:该类提供了一个静态方法来创建代理对象。它接收一个 ClassLoader 对象、一个 Class 数组和一个 InvocationHandler 对象作为参数,并返回一个代理对象。

import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;// 定义一个接口interface Subject {    void request();}// 实现接口的具体类class RealSubject implements Subject {    @Override    public void request() {        System.out.println("RealSubject: Handling request.");    }}// 创建动态代理类class ProxyHandler implements InvocationHandler {    private Object realObject;    public ProxyHandler(Object realObject) {        this.realObject = realObject;    }    @Override    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        System.out.println("ProxyHandler: Preparing request.");        Object result = method.invoke(realObject, args);        System.out.println("ProxyHandler: Cleaning up after request.");        return result;    }}public class Client {      public static void main(String[] args) {        // 创建真实主题对象        Subject realSubject = new RealSubject();        // 创建代理处理器对象并传入真实主题对象        ProxyHandler handler = new ProxyHandler(realSubject);        // 使用 Proxy.newProxyInstance() 方法动态生成代理对象        Subject proxy = (Subject) Proxy.newProxyInstance(                Client.class.getClassLoader(), new Class[]{Subject.class}, handler);        // 调用代理对象的方法        proxy.request();    }}

我们定义了一个接口 Subject 和具体类 RealSubject,创建了一个代理处理器 ProxyHandler,它会在访问真实主题对象前后执行一些额外的逻辑。接着,我们使用 Proxy 类的静态方法 newProxyInstance() 来创建代理对象,并将代理处理器和真实主题对象传递给它。

当客户端调用代理对象的 request() 方法时,代理处理器会先执行一些额外的逻辑,然后将请求转发给真实主题对象进行处理。在处理完成后,代理处理器还会再次执行一些额外的逻辑。

动态代理模式允许在运行时动态生成代理对象,并通过代理处理器来控制对被代理对象的访问。相比于普通代理模式,它更加灵活和通用。

代理模式应用得非常广泛,大到一个系统框架、企业平台,小到代码片段、事务处理,稍不留意就用到代理模式。可能该模式是大家接触最多的模式,而且有了AOP大家写代理就更加简单了,有类似Spring AOP和AspectJ这样非常优秀的工具,拿来主义即可!不过,大家可以看看源代码,特别是调试时,只要看到类似$Proxy0这样的结构,你就应该知道这是一个动态代理了。

- END -


下方扫码关注 软件质量保障,与质量君一起学习成长、共同进步,做一个职场最贵Tester!

  • 关注公众号, 后台回复【测开】获取测试开发xmind脑图

  • 扫码加作者, 获取加入测试社群!

往期推荐

聊聊工作中的自我管理和向上管理

经验分享|测试工程师转型测试开发历程

聊聊UI自动化的PageObject设计模式

细读《阿里测试之道》

我在阿里做测开文章来源地址https://www.toymoban.com/news/detail-441484.html

到了这里,关于设计模式|代理模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 设计模式|代理模式

    ​代理模式指为其他对象提供一种代理,以控制对这个对象的访问。在某些情况下,一个对象若不能直接引用另一个对象,而代理对象可以在客户端与目标对象之间起到中介的作用。 普通代理 普通代理模式是指在代理模式中,代理对象和真实对象都实现了相同的接口或继承

    2024年02月04日
    浏览(31)
  • 【设计模式】-代理模式

    在软件开发中,经常遇到需要对某个对象进行控制或者监控的场景。而直接修改对象的代码可能使代码变得复杂且难以维护。这时,使用代理模式(Proxy Pattern)可以很好地解决这个问题。          代理模式是一种结构型设计模式, 通过引入一个代理对象来替代原始对象

    2024年02月13日
    浏览(34)
  • 设计模式详解-代理模式

    类型:结构型模式 实现原理:创建具有现有对象的对象 作用:为其他对象提供一种代理以控制对这个对象的访问。 解决的问题:由于对象的访问条件不一,直接访问对象会造成麻烦问题 解决问题的方法:增加中间层。 何时使用:想在访问一个类时做一些控制。 实现核心:

    2024年02月12日
    浏览(36)
  • 设计模式 -- 代理模式

    月是一轮明镜,晶莹剔透,代表着一张白纸(啥也不懂) 央是一片海洋,海乃百川,代表着一块海绵(吸纳万物) 泽是一柄利剑,千锤百炼,代表着千百锤炼(输入输出) 月央泽,学习的一种过程,从白纸-吸收各种知识-不断输入输出变成自己的内容 希望大家一起坚持这个过程,也同样希望大家

    2023年04月08日
    浏览(37)
  • 【设计模式】代理模式

    5.1.1 概述 由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。 Java中的代理按照代理类生成时机不同又分为静态代理和动态代理。静态代理代理类在编译期就生成

    2024年02月15日
    浏览(47)
  • 设计模式——代理模式

    代理模式(Proxy Pattern)是一种结构型设计模式,它为其他对象提供一个代理以控制对这个对象的访问。代理对象在客户端和目标对象之间起到中介作用,可以添加额外的功能或限制对目标对象的直接访问。 抽象主题(Subject Interface): 定义了目标对象和代理对象共有的接口。

    2024年01月17日
    浏览(47)
  • 设计模式(5)代理模式

    一、介绍: 1、组成结构: (1)Subject/抽象角色:定义了RealSubject和Proxy的共用接口,这样就可以在任何使用        RealSubject的地方都可以使用Proxy (2)RealSubject/真实角色:定义Proxy所代表的真实实体 (3)Proxy/代理角色:保存一个引用使得代理可以访问实体,并提供一个与

    2024年02月13日
    浏览(31)
  • 设计模式-代理模式

    ● 为对象提供一个代理类,增强该对象的方法,控制对这个对象的访问 ● 静态代理和动态代理:静态代理就是编译的时候就已经确定,而动态代理就是运行时才会生成 缓存代理 ● 提供数据的缓存功能,避免数据库重复查询 实践 定义数据查询的接口 接口实现类实现接口

    2024年02月11日
    浏览(33)
  • 设计模式二:代理模式

    1、什么是动态代理 可能很多小伙伴首次接触动态代理这个名词的时候,或者是在面试过程中被问到动态代理的时候,不能很好的描述出来,动态代理到底是个什么高大上的技术。不方,其实动态代理的使用非常广泛,例如我们平常使用的 Spring 中的 @Transactional 注解,其依赖

    2024年02月20日
    浏览(45)
  • 设计模式--代理模式

    笔记来源:尚硅谷Java设计模式(图解+框架源码剖析) 1)代理模式:为一个对象提供一个替身,以控制对这个对象的访问。即 通过代理对象访问目标对象 2)这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能 3)被代理的对象可以

    2024年02月10日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包