设计模式学习——代理模式

排查单片机不工作的‘玄学’故障:从LDO选型、复位电路到焊接不良的完整避坑指南 本文深入剖析单片机不工作的常见硬件故障,从LDO选型、复位电路设计到PCB布局和焊接工艺,提供系统性排查方法。重点分析3.3V电源稳定性、LDO动态响应特性及复位电路设计要点,帮助工程师快速定位和解决嵌入式系统中的'玄学'故障,提升产品可靠性。 阅读详情



基本介绍

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

静态代理

静态代理的基本介绍

静态代理在使用时,需要定义接口或者父类,被代理对象(即目标对象)与代理对象一起实现相同的接口或者是继承相同父类

静态代理类图实例

在这里插入图片描述
说明:

  1. 定义一个接口ITeacherDao
  2. 目标对象TeacherDao实现接口ITeacherDao
  3. 使用静态代理方式就需要在代理对象TeacherDaoProxy中也实现ITeacherDao接口
  4. 调用的时候通过调用代理对象的方法来调用目标对象。
  5. 特别提醒:代理对象与目标对象要实现相同的接口,然后通过调用相同的方法来调用目标对象的方法。
静态代理代码实例
public interface ITeacherDao {
    void teach(); //授课的方法
}

被代理对象

public class TeacherDao implements ITeacherDao {
    @Override
    public void teach() {
        System.out.println("老师授课中....");
    }
}

代理对象

//代理对象
public class TeacherDaoProxy implements ITeacherDao {

    private ITeacherDao target;//目标对象,通过接口来聚合


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

    @Override
    public void teach() {
        System.out.println("开始代理,完成某些操作......");
        target.teach();
        System.out.println("代理结束");
    }
}

测试用例

public class Client {
    public static void main(String[] args) {
        //创建目标对象(被代理对象)
        TeacherDao teacherDao = new TeacherDao();
        //创建代理对象,同时将被代理对象传递给代理对象
        TeacherDaoProxy teacherDaoProxy = new          TeacherDaoProxy(teacherDao);
        //通过代理对象,调用到被代理对象的方法
        //即:执行的是代理对象的方法,代理对象再去调用目标对象的方法。
        teacherDaoProxy.teach();
    }
}
静态代理优缺点
  1. 优点:在不修改目标对象的功能前提下,能通过代理对象对目标功能扩展
  2. 缺点:因为代理对象需要与目标对象实现一样的接口,所以会有很多代理类
  3. 一旦接口增加方法,目标对象与代理对象都要维护。

动态代理

动态代理模式基本介绍
  1. 代理对象,不需要实现接口,但是目标对象要实现接口,否则不能用动态代理
  2. 代理对象的生成,是利用JDK的API,动态的在内存中构建代理对象。
  3. 动态代理也叫做:JDK代理、接口代理。

JDK生成代理对象的API

  1. 代理类所在包:java.lang.reflect.Proxy
  2. JDK实现代理只需要使用newProxyInstance方法,但是该方法需要接收三个参数
动态代理类图实例

在这里插入图片描述

动态代理代码实例
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("hello" + name);
    }
}

代理工厂

public class ProxyFactory {

    //维护一个目标对象,Object
    private Object target;

    public ProxyFactory(Object target) {
        this.target = target;
    }

    //给目标对象生成一个代理对象
    public Object getProxyInstance(){

        /**
         * public static Object newProxyInstance(ClassLoader loader,
         *                                           Class<?>[] interfaces,
         *                                           InvocationHandler h)
         * 参数说明:
         *   1. ClassLoader:指定当前目标对象使用的类加载器,获取加载器的方法固定
         *   2. Class<?>[] interfaces:目标对象实现的接口类型,使用泛型的方式确认类型
         *   3. InvocationHandler h:事件处理,执行目标对象的方法时,会触发事件处理器
         *   的方法,会把当前执行的目标对象方法作为参数传入。
         */
        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("JDK代理开始~");
                        //反射机制调用目标对象的方法
                        Object returnVal = method.invoke(target, args);
                        System.out.println("JDK代理提交");
                        return returnVal;
                    }
                });
    }
}

测试用例

public class Client {

    public static void main(String[] args) {
        //创建目标对象
        ITeacherDao target = new TeacherDao();
        //给目标对象创建代理对象,可以转为ITeacherDao
        ITeacherDao proxyInstance = (ITeacherDao) new ProxyFactory(target).getProxyInstance();

        //打印信息:proxyInstanceclass com.sun.proxy.$Proxy0
        //说明:内存中动态生成了代理对象
        System.out.println("proxyInstance" + proxyInstance.getClass());

        //通过代理对象调用目标对象得方法。
        proxyInstance.teach();

        proxyInstance.sayHello("Tom");
    }
}

Cglib代理

Cglib代理模式得基本介绍
  1. 静态代理和JDK代理模式都要求目标对象是实现一个接口,但是有时候目标对象只是一个单独得对象,并没有实现任何得接口,这个时候可使用目标对象子类来实现代理-这就是Cglib代理。
  2. Cglib代理也叫作子类代理,它是在内存中构建一个子类对象从而实现对目标对象功能扩展,有些书也将Cglib代理归属到动态代理。
  3. Cglib是一个强大的高性能的代码生成包,它可以在运行期扩展java类与实现java接口.它广泛的被许多AOP的框架使用,例如Spring AOP,实现方法拦截。
  4. 在AOP编程中如何选择代理模式:
    1 > 目标对象需要实现接口,用JDK代理
    2 > 目标对象不需要实现接口,用Cglib代理
  5. Cglib包的底层是通过使用字节码处理框架ASM来转换字节码并生成新的类
Cglib代理模式类图实例

在这里插入图片描述
说明:

  1. 给目标对象target创建一个代理对象
  2. 重写intercept方法,实现对被代理对象(目标对象)方法调用
Cglib代理模式代码实例

被代理对象

public class TeacherDao {
    public void teach() {
        System.out.println("老师授课中,我是Cglib代理,不需要实现接口");
    }
}

代理工厂

public class ProxyFactory implements MethodInterceptor {

    //维护一个目标对象
    private Object target;

    //构造器,传入一个被代理的对象
    public ProxyFactory(Object target) {
        this.target = 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();
        //执行代理对象的方法,出发intercept方法,从而实现对目标对象的调用
        proxyInstance.teach();
    }
}

代理模式(Proxy)的变体

  1. 防火墙代理
    内网通过代理穿透防火墙,实现对公网的访问。
  2. 缓存代理
    比如,当请求图片文件等资源时,先到缓存代理取,如果取到资源则OK,如果取不到资源,再到公网或者数据库取,然后缓存。
  3. 远程代理
    远程对象的本地代表,通过它可以把远程对象当本地对象来调用,远程代理通过网络和真正的远程对象沟通信息。
  4. 同步代理
    主要使用再多线程编程中,完成多线程间同步工作
深入理解 ABAP 中的 Fast Data Access:从 @itab 到 FOR ALL ENTRIES 的性能关键路径 ABAP性能优化的关键在于理解Fast Data Access(FDA)机制,它连接了应用服务器的内表与数据库运算。FDA允许将内表数据推送到数据库进行筛选、聚合等操作,是SELECT...FROM@itab语法的基础。开发者需注意:1)该语法可能在内置引擎或数据库执行;2)仅当SQL能力超出ABAP范围时才建议使用;3)需通过CL_ABAP_DBFEATURES检查数据库支持情况。合理使用FDA可优化批量数据处理,但滥用可能导致性能下降。 阅读详情

相关推荐

秦时明月6.2魔改版_从零到一部署指南_含安卓客户端配置与GM后台直通

本文详细介绍了秦时明月6.2魔改版的从零到一部署指南,包括环境准备、服务端安装、安卓客户端配置以及GM后台直通等关键步骤。特别针对安卓客户端配置和GM工具使用提供了实用技巧,帮助用户快速搭建并优化游戏服务器,确保稳定运行。

weixin_42522964的博客 315

跟萌新一起学设计模式(四)之建造者模式

** 设计模式(四)之建造者模式 ** 案例说明   本文以创建一个电脑实体类的例子来体现建造者模式的写法和优缺点,并对传统意义上的建造者模式进行一定程度的魔改,结合UML类图和代码一起说明。 不用建造者模式的传统写法   我们通过对同一个实体类中不同的属性设置具体的值来模拟现实业务中建造某种商品的过程,故可以通过构造器或者是set方法来模拟实现。以下是UML类图和代码实现:   电脑实体类 @Data @NoArgsConstructor @AllArgsConstructor public c

weixin_45889311的博客 290

【护网行动-红蓝攻防】第一章-红蓝对抗基础 认识红蓝紫

军事上的演练,是除了实战以外最能检验军队战斗力的一种考核方式,他可以模拟面对外部势力的攻击时候,如何更好的去维护国家和主权的安全。同样的,在网络上面,真实环境下的网络攻防演练也是检验一个单位,企业网络防御能力,发现潜在危险最好的方法。1.政策要求2安全威胁驱动当前,我国关键信息基础设施面临的网络安全形势严峻复杂,网站平台大规模数据泄露事件频发,生产业务系统安全隐患突出,甚至有的系统长期被控面对高级持续性的网络攻击,防护能力十分欠缺。目前,我国面临的网络安全威胁主要有以下几点。

wxh的博客 1574

在IntelliJ IDEA中创建和运行java/scala/spark程序

本文将分两部分来介绍如何在IntelliJ IDEA中运行Java/Scala/Spark程序: 基本概念介绍 在IntelliJ IDEA中创建和运行java/scala/spark程序 基本概念介绍 IntelliJ IDEA 本文使用版本为: ideaIC-2020.1 IDEA 全称 IntelliJ IDEA,是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的java开发工具,它的旗舰版本还支持HTML,CSS,PHP,MySQL,Python等,免费版只支持Java,

程序员泥瓦匠 2001

OSMDroid 切换地图不更新的问题

用OSMDroid加载Google地图的时候 需要有按钮切换不同图层的地图,如果发现调用了mMapView.setTileSource(ITileSource aTileSource)方法的时候发现地图View没有更新的话,可能是因为两个实例化TileSource对象其子类BitmapTileSourceBase这个类的aName成员变量值一样导致的地图在setTileSource出现不更新问题,...

godoge的博客 1039

Halcon 3D视觉实战:5步将线激光高度数据转为可分析的深度图与点云

本文详细介绍了如何利用Halcon平台将线激光高度数据转换为深度图与点云的5步实战方法。通过具体代码示例和工业检测案例(如锂电池胶水测量),帮助工程师高效处理3D视觉数据,实现从原始数据到三维可视化的完整技术链路。

weixin_29039773的博客 361

Cannot run program “D:\JDK\bin\java.exe“ (in directory “C:\Program Files\JetBrains\IntelliJ IDEA 202

Cannot run program "D:\JDK\bin\java.exe" (in directory "C:\Program Files\JetBrains\IntelliJ IDEA 2022.2.3\bin"): CreateProcess error=2, 系统找不到指定的文件。

m0_60204745的博客 2万+

【OpenClaw从入门到精通】第35篇:电商“龙虾”掘金记——用OpenClaw实现小红书/抖音/淘宝全自动矩阵运营(2026实测版)

2026年,OpenClaw智能体已成为电商运营的“效率革命工具”,其多平台自动化能力让单人可完成传统3-5人的工作量。本文基于真实商业案例(来源:海报新闻、阿里云开发者社区等),系统拆解OpenClaw在小红书、抖音、淘宝的全链路运营方案:从阿里云部署搭建基础环境,到三大平台核心技能安装配置,再到跨平台矩阵工作流落地;同时揭秘代部署、模板售卖、轻定制、内容套利四大变现模式,并详解Token成本控制、安全风险规避等关键问题。文中所有代码均经过2026年3月实测验证,提供完整可复现的技术方案,帮助读者快速搭建

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 2043

idea运行项目报错Cannot run program “C:\Program Files\Java\jdk1.8.0_121\bin\java.exe......解决办法

在环境变量都配置完好的情况下,基本就是idea的配置除了问题可以检查以下几点。 1、SDKs检查 2、路径检查 3、项目配置检查

david2000999的博客 3万+

第42章:BRepBuilderAPI_MakeEdge(构建边)

是 OpenCascade 中用于构建边(Edge)的类。边是几何建模中的基本元素之一,通常连接两个顶点,并且可以有不同的几何形式,如直线、圆弧、样条曲线等。提供了多种创建边的方法,包括通过给定两个顶点、通过参数化曲线、通过给定起始和结束点的方式等。方法说明示例使用两个顶点创建直线边使用Geom_Curve创建边使用两点的坐标创建边Shape()获取创建的边。

yumeiguo的博客 182

C#串口通信从入门到精通(7)——整数/浮点数与二进制、八进制、十六进制之间的转换与C#实现

本文详细介绍由博主开发的DataConvert串口通信帮助类的用法,该帮助类涵盖了串口通信领域所有的数据转换方法,帮助大家快速编写串口通信程序!

qq_34059233的博客 2880

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

目录代理模式静态代理动态代理Cglib代理代理模式的变体防火墙代理缓存代理远程代理同步代理 代理模式 基本介绍 代理模式(Proxy Pattern):为一个对象提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象,这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。 被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象 代理模式有不同...

minge0001的博客 277

基于YOLOv8的城市违建识别系统:从数据集构建到UI界面实现

YOLOv8是Ultralytics公司于2023年推出的最新一代YOLO(You Only Look Once)系列目标检测算法。更高效的骨干网络设计改进的锚框机制更精确的损失函数支持分类、检测、分割等多任务YOLOv8特别适合像违建识别这样的实时检测任务,能够在保持高精度的同时实现快速推理。

YOLO 674

设计模式 - 学习笔记 - 代理模式ProxyPattern

设计模式 - 学习笔记 - 代理模式ProxyPattern学习总结要点总结UML参考资料 学习总结 既然叫代理,就想一下我们什么情况用代理——不方便直接访问(控制)的时候。比如:分布式、AOP 所以核心就是间接访问(控制) 要点总结 “增加一层间接层"是软件系统中对许多复杂问题的一种常见解决方法。在面向对象系统中,直接使用某些对象会带来很多问题,作为间接层的proxy对象便是解决这一问题的常用手段。 具体proxy设计模式的实现方法、实现粒度都相差很大,有些可能对单个对象做细粒度的控制,如copy-

灵台方寸山斜月三星洞 495

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

设计模式之代理模式学习demo

设计模式之代理模式学习demo

hymanxq的专栏 494

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

设计模式学习—代理模式(Proxy Design Pattern)

代理模式的学习

闲鱼的博客 368

学习设计模式 - 代理模式

学习设计模式 - 代理模式 一丶定义   代理模式为另一个对象提供替身或者占位符以控制对这个对象访问, 被代理的对象可以是远程的对象、创建开销大的对象、需要安全控制的对象 二丶理解   2.1) 当一个对象除了处理真正的业务逻辑之外, 还需要增加额外的处理,如事务,打印日志等等, 如果将这些额外逻辑放到原对象中,会造成职责不清晰.   这时可以使用代理对象代理该对象...

weixin_30606461的博客 109

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

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

gnuhpc的专栏 2961

设计模式学习之代理模式

https://yangguangfu.iteye.com/blog/815787

qq_32534441的博客 173

基于Python学习《Head First设计模式》第十一章 代理模式

先大致了解,更多细节后续用到再扩展学习补充。

wzx77的博客 422

学习设计模式《十》——代理模式

代理模式的本质【控制对象访问】;

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 1002

设计模式学习之——代理模式

设计模式学习,代理模式,代理模式与装饰者模式的区别与联系,代理模式在spring框架中的应用等

github_38727595的博客 1159

设计模式中代理模式的学习

从前在看代理模式的时候,经常是一头雾水,和工厂模式相比,感觉这种模式很高深莫测,但是经过一段时间的开发,甚至用过很多反射模式之后。再来看代理模式,感觉也不是很难理解,以下是我对代理模式的学习过程。 对于代理,经过在网上学习了一段时间,也阅读了很多文章,个人总结为在不对对象本身进行修改的情况下,对对象进行功能的扩展即为代理。 通过网上的学习,代理一般可以分为静态代理与动态代理 假设我们现...

StartLine 296

设计模式学习04:代理模式

设计模式学习04:代理模式 本文转载:https://blog.youkuaiyun.com/u012153129/article/details/81806602 作者:SUN_Eudemon 什么是代理模式   代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。    这句话看起来比较抽象,不太好理解,举个现实的例子:外卖。在有饿了么之类的外卖出现前,我们如果点了外卖很多时候都是由...

weixin_33836223的博客 98

Java23种设计模式之代理模式的学习

源码链接(Gitee码云):https://gitee.com/oldou/javadesignpatterns 这里有我整理好的Java23种设计模式的源码以及博客教程,博客教程中介绍了Java23种设计的模式的各种实现方式以及应用场景,非常适用于学习以及提高我们的设计思维,如果对大家有所帮助,请记得star一下给予作者一定的精神支持,你的star是我写出更好的博客的动力,谢谢大家。 代理模式(proxy pattern) 在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种..

weixin_43246215的博客 2204
上一篇: 多线程编程学习——04线程的通讯机制
下一篇: 并发编程面试题(2020最新版)——修正版
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值