设计模式-12代理模式

C++ 设计模式12:代理模式   代理模式(PROXY),也称为委托模式,作用就是找一个对象来替我们访问某个对象,就像租房子,需要找中介,中介就是属于代理。   租房子模型 #include <iostream> #include <string> using namespace std; class Person { public: virtual void rentHouse() = 0; }; class Mike :public Person { public: void rentH 阅读详情

代理模式

介绍:
  • 代理模式为对象提供一个替身,以控制对这个对象的访问,即通过代理对象访问目标对象,这样做的好处是,可以在目标对象实现的基础上,增强额外的功能和操作,即扩展了目标对象的功能
  • 被代理的对象可以是远程对象、创建开销大的对象或者需要安全控制的对象
  • 代理模式又不同形式,主要可以分为三种:
    1)静态代理
    2)动态代理,也可以成为JDK代理,接口代理
    3)Cglib代理,可以在内存中动态的创建对象,而不需要实现接口,他是属于动态代理的范畴
静态代理
介绍:

​ 静态代理在使用时,需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或者是继承相同父类
在这里插入图片描述

public interface ITeacherDao {
    void teach();
}

/**
 * 目标类
 */
public class TeacherDao implements ITeacherDao {
    @Override
    public void teach() {
        System.out.println("老师在上课...");
    }
}

/**
 * 代理类
 */
public class TeacherDaoProxy implements ITeacherDao{

    private ITeacherDao iTeacherDao;

    public TeacherDaoProxy(ITeacherDao iTeacherDao) {
        this.iTeacherDao = iTeacherDao;
    }

    @Override
    public void teach() {
        System.out.println("执行目标方方法之前的一些操作。。。");
        iTeacherDao.teach();
        System.out.println("执行目标方法之后的一些操作。。。");
    }
}

public class Client {
    public static void main(String[] args) {
        TeacherDao teacherDao = new TeacherDao();
        TeacherDaoProxy teacherDaoProxy = new TeacherDaoProxy(teacherDao);

        teacherDaoProxy.teach();
    }
}
总结:

优点:在不修改目标对象的功能前提下,能通过代理对象对目标功能扩展

缺点:因为代理对象需要与目标对象实现一样的接口所以会有很多代理类,一旦接口增加方法,目标对象与代理对象都要维护

动态代理
介绍:
  • 代理对象,不需要实现接口,但目标对象要实现接口,否则不能用动态代理
  • 代理对象的生成,是利用JDK的API,动态的在内存中构建代理对象
  • 动态代理也叫做JDK代理或者接口代理
JDK中生成代理对象的API
  • 代理类所在包:java.lang.reflect.Proxy

  • JDK实现代理只需要使用newProxyInstance方法,但是该方法需要接收三个参数,完整的写法是:

static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)

在这里插入图片描述

public interface ITeacherDao {
    void teach();

    void sayHello(String name);
}

/**
 * 目标类
 */
public class TeacherDao implements ITeacherDao {
    @Override
    public void teach() {
        System.out.println("老师在上课...");
    }

    @Override
    public void sayHello(String name) {
        System.out.println("你好!" + name);
    }
}

public class ProxyFactory {

    private Object target;

    public ProxyFactory(Object target) {
        this.target = target;
    }
    //public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
    /**
     * 1.ClassLoader:指定当前目标对象使用的类加载器,获取加载器的方法固定
     * 2.Class<?>[] interfaces:目标对象实现的接口类型,使用反向方法确定类型
     * 3.InvocationHandler h:事件处理,执行目标对象的方法时,会触发事件处理器方法,
     * 会把当前执行的目标对象方法作为参数传入
     */
    public Object getProxyInstance() {
        return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("执行代理方法开始。。");
                Object returnVal = method.invoke(target, args);
                System.out.println("执行代理方法结束。。");
                return returnVal;
            }
        });
    }
}

public class Client {
    public static void main(String[] args) {
        //创建目标对象
        ITeacherDao target = new TeacherDao();
        //给目标对象创建代理对象,可以转成ITeacherDao
        ITeacherDao proxyInstance = (ITeacherDao) new ProxyFactory(target).getProxyInstance();
        //proxyInstancecom.h3c.com.designpattrn.proxy.dynamic.TeacherDao@12a3a380
        //每次调用法法时都会触发InvocationHandler中的方法,只有调用方法时才会执行目标方法
        //System.out.println("proxyInstance" + proxyInstance);
        //System.out.println("proxyInstance" + proxyInstance);
        //proxyInstanceclass com.sun.proxy.$Proxy0 内存中生成的代理对象
        System.out.println("proxyInstance" + proxyInstance.getClass());
        //proxyInstance.teach();
        /**
         * 执行代理方法开始。。
         老师在上课...
         执行代理方法结束。。
         */
        proxyInstance.sayHello("tom");
    }
}
Cglib代理
介绍:
  • 静态代理和JDK代理模式都要求目标对象时实现一个接口,但是有时候目标对象只是一个单独的对象,并没有实现任何接口,这个时候可使用目标对象子类来实现代理就是Cglib代理

  • Cglib代理也叫做子类代理,他是内存中构建一个子类对象从而实现对目标对象功能扩展,有些书也叫Cglib代理归属到动态代理

  • Cglib是一个强大的高性能的代码生成包,它可以在运行期扩展java类与实现java接口,它广泛的被许多AOP的框架使用,例如spring aop,实现方法拦截

  • 在aop编程中如何选择代理模式

    1.目标对象需要实现接口,用JDK代理

    2.目标对象不需要实现接口,用Cglib代理

  • Cglib包的底层是通过使用字节码处理框架ASM来转换字节码并生成新的类

Cglib代理实现步骤:
  • 引入Cglib的jar文件
  • 在内存中动态构建子类,注意代理类不能为final,否则会报错
  • 目标对象的方法如果为final/static,那么就不会被拦截,即不会执行目标对象额外的业务方法
    在这里插入图片描述
<!--添加cglib依赖包 -->
		<dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>2.2.2</version>
        </dependency>
        public class TeacherDao {
    public void teach() {
        System.out.println("老师在上课...");
    }

    public void sayHello(String name) {
        System.out.println("你好!" + name);
    }
}

/**
 * cglib代理借助于Enhancer获取代理对象
 */
public class ProxyFactory implements MethodInterceptor {
    //维护一个目标对象
    private Object target;
    //构造器
    public ProxyFactory(Object target) {
        this.target = target;
    }

    public Object getProxyInstance(){
        //1.创建一个工具类
        Enhancer enhancer = new Enhancer();
        //2.设置父类
        enhancer.setSuperclass(target.getClass());
        //3.设置回调函数
        enhancer.setCallback(this);
        //4.创建代理对象
        return enhancer.create();
    }
    //重写intercept方法,会调用目标对象的方法
    public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        System.out.println("执行cglib代理之前、、、开始");
        Object returnVal = method.invoke(target, args);
        System.out.println("执行cglib代理之后、、、结束");
        return returnVal;
    }
}


public class Client {
    public static void main(String[] args) {
        //创建目标对象
        TeacherDao target = new TeacherDao();
        //获取代理对象
        TeacherDao proxyInstance = (TeacherDao)new ProxyFactory(target).getProxyInstance();
        //执行目标方法
        proxyInstance.teach();
        proxyInstance.sayHello("jack");
    }
STM32—时钟树(结合系统时钟函数理解) 时钟树的概念: 我们可以把MCU的运行比作人体的运行一样,人最重要的是什么?是心跳! 心脏的周期性收缩将血液泵向身体各处。心脏对于人体好比时钟对于MCU,微控制器(MCU)的运行要靠周期性的时钟脉冲来驱动,而这个脉冲的始源往往是由外部晶体振荡器提供时钟输入,最终转换为多个外部设备的周期性运作。这种时钟“能量”的传递路径犹如大树的养分由主干流向个分支,因此称为时钟树。 STM32时钟: 在STM32... 阅读详情

相关推荐

视觉语言模型对抗攻击与防御:从传统方法到多模态挑战

本文深入探讨了视觉语言模型(VLM)面临的对抗攻击与防御挑战,从传统单模态攻击到多模态威胁的演进。分析了包括FGSM、PGD等经典攻击方法,以及新兴的多模态攻击如跨模态对抗样本和越狱攻击。同时提出了跨模态一致性检查、动态防御机制等创新防御策略,并结合医疗影像诊断等实战案例,为提升AI系统安全性提供了重要见解。

weixin_29231725的博客 391

HeadFirst 设计模式学习笔记12——代理模式

本文已搬家至【HeadFirst 设计模式学习笔记】12 代理模式

gnuhpc的专栏 2961

常学常新:《Attention Is All You Need》万字解读!

常学常新:《Attention Is All You Need》万字解读!

hunteritself的博客 3639

【设计模式12】代理模式

代理模式是一种结构型设计模式,通过引入代理对象来控制对真实对象的访问。电商系统中,商品详情页面临高并发访问时,直接访问数据库会导致性能问题。代理模式可以优雅地解决缓存穿透、雪崩、服务降级等痛点,其核心思想是在不修改原有对象的基础上,通过代理扩展功能(如缓存、权限控制等)。实现方式包括静态代理和动态代理,静态代理需要手动创建代理类,而动态代理(如JDK动态代理)则更加灵活,可通过注解等方式自动处理缓存逻辑。代理模式广泛应用于远程调用、缓存、权限控制等场景。

专注后端技术架构,AI技术分享 941

5GCPE与4G物联网卡兼容实战:通过AT指令修改IMEI实现设备迁移

本文详细介绍了如何通过AT指令修改5GCPE设备的IMEI,实现4G物联网卡的设备迁移。从硬件准备、驱动安装到串口工具配置,再到具体的AT指令操作步骤,提供了全面的实战指南。文章还包含信号优化、APN设置等实用技巧,帮助用户顺利完成设备迁移并提升网络性能。

weixin_28684757的博客 626

王道考研操作系统笔记(第一章)附:王道考研408所有PPT和思维导图

学习感想 别人的笔记对你的学习基本上没有用处,容易培养人的惰性,如需ppt和思维导图请拉到最后,有github链接 记笔记并不是一件浪费时间的事情,还有利于多次学习 真心希望大家在学习的过程中记笔记 操作系统 第一章 计算机系统概述 1.1 操作系统 1.1.1 操作系统的概念和功能 概念 操作系统(Operating System, OS)是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配;以提供给用户和其他软件方便的接口和环境;它是计算机系统中最基本的系统软

qq_41732756的博客 1万+

设计模式精讲 Day 12:代理模式(Proxy Pattern)

代理模式是一种结构型设计模式,它提供了一个代理对象,用于控制对另一个对象的访问。代理对象通常会封装真实对象的操作,并在调用之前或之后执行额外的逻辑,如权限校验、日志记录、延迟加载等。本篇详细介绍了代理模式的核心思想、实现方式、适用场景以及实际应用案例。我们通过 Java 代码展示了如何构建一个完整的代理模式系统,并结合 Spring AOP 案例说明了其在企业级应用中的价值。通过代理模式,我们可以有效控制对象的访问权限、实现延迟加载、增强系统功能,同时降低模块间的耦合度。

在未来等你的专栏 1165

新手必看|HDevelop核心算子快速上手,为C#移植打基础

在上一篇文章中,我们完成了C#+HALCON的开发环境搭建。但在实际工业开发中,绝不会直接在C#中编写视觉算法HDevelop可视化调试算法 → 验证效果 → 导出C#代码 → 集成到上位机。HDevelop是HALCON专属的算法调试工具,支持实时预览图像、参数动态调节、零编译运行,是新手入门和工业算法调试的核心工具。本文聚焦工业场景高频使用的核心算子,从基础操作到实战案例,手把手教你使用HDevelop;同时重点讲解算法导出C#的规范,让你调试完成的算法,能无缝移植到WinForm上位机中。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 777

设计模式 12 代理模式

代理模式通过创建一个代理对象来控制对另一个对象的访问。代理对象具有与原对象相同的接口,客户端可以通过代理对象访问实际的服务对象。代理对象可以在不影响客户端的情况下,对请求进行预处理或后处理。

Winemonk 1497

ubunut 系统安装k8s集群

修改配置文件 kube-metrics-server.yaml 添加监控数据采集容器启动参数,启动 tls 证书验证,否则监控容器接口验证不通过,无法采集监控数据。kube-metrics-server.yaml 140行左右添加参数 --kubelet-insecure-tls。服务器添加配置(配置三台阿里云时间同步服务器作为时间源,本机作为时间同步服务器)客户端配置(第一个源选用集群内的 192.168.10.20 )时间同步配置文件参考如下。

weixin_57489252的博客 1328

【深度学习新浪潮】2025年末AI产业动态:泡沫争议、技术突破与2026投资机会解析

2025年末的AI产业在波动中完成了阶段性调整,技术突破与政策支持构筑了长期成长基石,而结构性分化与风险隐患则要求投资者更加精准地把握机会。2026年作为“风险资产的黄金年”,AI全产业链将持续成为资本聚焦的核心,无论是算力国产化的技术突破,还是应用场景的规模化落地,都有望催生一批优质企业。投资者需立足产业阶段特征,理性看待短期波动,聚焦核心技术与政策红利,方能在AI产业的成长浪潮中把握确定性机会。

专注:太空算力、AI infra、异构调度、大模型成本工程 1809

设计模式12 - 代理模式

作者:billy 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 代理模式 使用场景 优缺点 注意事项 UML结构图 代码实现 ...

billy的博客 303

《测控仪器设计课后习题答案-浦昭邦-王宝光

《测控仪器设计课后习题答案-浦昭邦-王宝光 1.1. 测控仪器的概念是什么? 测控仪器则是利用测量和控制的理论,采用机、电、光各种计量测试原理及控制系统与计算机相结合的一种范围广泛的测量仪器。 1.2. 为什么说测控仪器的发展与科学技术发展密切相关? 仪器仪表的用途和重要性— 遍及国民经济各个部门,深入到人民生活的各个角落,仪器仪表中的计量测试仪器与控制仪器统称为测控仪器,可以说测控仪器的水平是科学技术现代化的重要标志。 仪器仪表的用途: 在机械制造业中:对产品的静态与动态性能测试;加工过程的控制与监测;设

无名何许人的博客 2976

设计模式12——代理模式

用例: //proxy.cpp //代理模式:为其它对象提供一种代理以控制对这个对象的方法。 #include "gtest/gtest.h" class Subject { public: Subject() {} virtual ~Subject() {} virtual int Request() = 0; }; ...

aomenfan1838的博客 100

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

12、设计模式之代理模式(Proxy)

设计模式之代理模式

weixin_45817985的博客 1114

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

python设计模式12-代理模式

1. 代理模式(Proxy)介绍 UML类图 角色介绍 Subject类,通过接口或抽象类声明真实角色实现的业务方法。 Proxy类,实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作 RealSubject,实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用 代理模式的适用场景 一个设计模式,只有当它有了应用场景,它才具备存在的价值。代理模式有很多可以使用的场景,主要分为如下几类: 远程代理:为一个对象的地址空间提供局部代表。 虚拟代理:根据需

rayylee 467

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

设计模式——代理模式12

代理模式

qq_45178641的博客 922

设计模式之12 - 代理模式Proxy

代理模式 比较简单,生活中有很多这样的例子,比如 有人在 天猫 上销售苹果手机,这个店铺就是苹果手机的一个代理;如果你想访问一个国外的网站,可能需要通过一个VPN代理来中转;某天犯懒,你通过百度点了外卖;还有满大街的房屋中介 等等,这些都是代理的例子。         先来看一下类结构图:         真实对象 与 代理类对象继承自统一接口,客户通过接口访问 代理Proxy,Pro

跟随技术的脚步-linolzhang的专栏 748

设计模式(12) 代理模式

代理模式的目地是为对象提供一种代理以控制对这个对象的访问。为什么会出现“通过一个代理对象,控制其他对象访问目标对象”这种场景,而不知直接new()出一个对象直接使用呢?这是因为在有些场景下对象的访问比较复杂,且需要一些额外的控制,这时如果直接new()出实例,并在调用端处理这些繁杂的细节,会增加系统的耦合。类似的场景有很多,比如远程访问、数据库访问、权限校验、负载均衡等等。 GOF对外观模式的描述为: Provide a surrogate or placeholder for another object

zhixin9001的博客 137

设计模式12-代理模式

设计模式12-代理模式代理模式应用实例角色RealTicketOffice代理测试代码测试结果代理模式在代理模式中,为另一个对象提供一个替身来控制整个对象的操作。应用实例在生活中,很多这样...

vipStone2的博客 139

Python设计模式详解之12 —— 代理模式

代理模式是一种结构型设计模式,它提供了一个代理对象来控制对目标对象的访问。代理可以在目标对象之前进行一些操作,如控制访问权限、延迟实例化或添加额外的功能。

拾工 384

设计模式(12)代理模式

模式介绍 代理模式提供代理或占位符对象来控制对另一个不同对象的访问。代理对象可以以与包含对象的方式相同的方式使用。 示例 我们再次以高端餐馆的服务员来建模,服务员需要做三件事情: 取单 下单 结账 抽象的服务员接口: /// <summary> /// The Subject interface which both the RealSubject and proxy w...

Travelling1006的专栏 131

C#设计模式之12-代理模式

代理模式(Proxy Pattern) 代理模式属于结构型模式,为其他对象提供一种代理以控制对这个对象的访问。 在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。 角色: 1、抽象主题(Subject) 通过接口或抽象类声明真实角色实现的业务方法; 2、代理主题(Proxy) 真实角色的代理,通过真实角色的业务逻辑方法来实现抽...

比特飞 1万+

【设计模式】(12)代理模式

通过本教程,你可以掌握代理模式在访问控制和功能增强中的核心技巧,并能够灵活应用于实际开发场景。,控制对原始对象的访问,并在访问前后添加额外逻辑(如权限校验、延迟加载、日志记录)。在哪些场景下,代理模式会导致系统复杂度增加?:在不修改原始对象的前提下,增强其功能或控制其访问。使用Java动态代理为服务接口自动添加日志功能。,对耗时方法(如数据库查询)的结果进行缓存。延迟加载大图,直到真正需要显示时才加载。,要求只有管理员用户才能删除文件。使用动态代理实现一个。代理模式通过引入一个。

因为热爱,所以付出 620

设计模式(12)——代理模式

在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。 在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。 静态代理 静态代理在使用时,需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或者是继承相同父类。 下面举个案例来解释: 我想买个外国的东西,我买不到,只能找代理人代购。 模拟购买动作,定义一个购买动作的人类Peop...

小书童的博客 191

Java设计模式[12]-代理模式

代理模式的基本介绍 代理模式:为一个对象提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。 被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象。 代理模式有不同的形式, 主要有三种 静态代理、动态代理 (JDK代理、接口代理)和 Cglib代理 (可以在内存动态的创建对象,而不需要实现接口, 他是属于动态代理的范畴) 。 代理模式示意图: 在AOP编程中如何选择代理模式 目标对象

JensenPWLee的博客 157
上一篇: 设计模式-10外观模式
下一篇: 设计模式-11享元模式
胖柯G
博客等级 码龄10年 453粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值