代理模式的学习

13 万字 C 语言从入门到精通保姆级教程2021 年版 13 万字C语言保姆级教程,从入门到精通。 阅读详情

应用例子:

​ 一个老师请假了,需要一个代课老师。

代理模式

 让你能够提供对象的替代品或其占位符。 代理控制着对于原对象的访问, 并允许在将请求提交给对象前后进行一些处理。即通过代理对象访问具体目标对象。

​

分类:

 静态代理

 动态代理(JDK代理、接口代理)

  Cglib代理(可以在内存动态创建,而不需要实现接口)

 

代理模式结构

在这里插入图片描述

 1. 服务接口 (Service Interface) 声明了服务接口。 代理必须遵循该接口才能伪装成服务对象。

 2. 服务(Service) 类提供了一些实用的业务逻辑。

 3. 代理 (Proxy) 类包含一个指向服务对象的引用成员变量。 代理完成其任务 (例如延迟初始化、 记录日志、 访问控制和缓存等) 后会将请求传递给服务对象。 通常情况下, 代理会对其服务对象的整个生命周期进行管理。

 4. 客户端(Client) 能通过同一接口与服务或代理进行交互, 所以你可在一切需要服务对象的代码中使用代理。

 

代理模式适合应用场景

 1.延迟初始化 (虚拟代理)。如果你有一个偶尔使用的重量级服务对象,一直保持该对象运行会消耗系统资源时, 可使用代理模式.

 2.访问控制 (保护代理)。 如果你只希望特定客户端使用服务对象**,** 这里的对象可以是操作系统中非常重要的部分**,** 而客户端则是各种已启动的程序 (包括恶意程序), 此时可使用代理模式**。

 3. 本地执行远程服务 (远程代理)。 适用于服务对象位于远程服务器上的情形。

 4.记录日志请求 (日志记录代理)。 适用于当你需要保存对于服务对象的请求历史记录时。 代理可以在向服务传递请求前进行记录。

 5.智能引用。 可在没有客户端使用某个重量级对象时立即销毁该对象。

 

实现方式

 1. 如果没有现成的服务接口, 你就需要创建一个接口来实现代理和服务对象的可交换性。 从服务类中抽取接口并非总是可行的, 因为你需要对服务的所有客户端进行修改, 让它们使用接口。 备选计划是将代理作为服务类的子类, 这样代理就能继承服务的所有接口了。

 2. 创建代理类, 其中必须包含一个存储指向服务的引用的成员变量。 通常情况下, 代理负责创建服务并对其整个生命周期进行管理。 在一些特殊情况下, 客户端会通过构造函数将服务传递给代理。

 3. 根据需求实现代理方法。 在大部分情况下, 代理在完成一些任务后应将工作委派给服务对象。

 4. 可以考虑新建一个构建方法来判断客户端可获取的是代理还是实际服务。 你可以在代理类中创建一个简单的静态方法, 也可以创建一个完整的工厂方法。

 5. 可以考虑为服务对象实现延迟初始化。

 

代理模式优缺点

 优点:

  ✔️ 你可以在客户端毫无察觉的情况下控制服务对象。

  ✔️ 如果客户端对服务对象的生命周期没有特殊要求, 你可以对生命周期进行管理。

  ✔️即使服务对象还未准备好或不存在, 代理也可以正常工作。

  ✔️开闭原则。 你可以在不对服务或客户端做出修改的情况下创建新代理。

​  缺点:

  ❌代码可能会变得复杂, 因为需要新建许多类。

  ❌ 服务响应可能会延迟。

相关的代理模式实现

静态代理

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

在这里插入图片描述

public interface Theacher {
    void teach();//上课
}

public class SchoolTeacher implements Theacher{
    @Override
    public void teach() {
        System.out.println("老师在上课...");
    }
}

Proxy

public class ProxyTeacher implements Theacher{

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

    public ProxyTeacher(Theacher 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) {
        //创建 老师(目标对象)
        SchoolTeacher st = new SchoolTeacher();

        //创建代理对象,同时把被代理对象传递给代理对象
        ProxyTeacher pt = new ProxyTeacher(st);

        pt.teach();
    }
}

​ 优点:

​  在不改变目标对象的前提下,能通过代理对象对目标的功能进行拓展

​ 缺点:

​  因为代理对象需要与目标对象实现一样的接口,所以会有很多代理类

​  一旦接口增加了方法,目标对象与代理对象都要维护

动态代理

​  代理对象依赖JDK的API,动态的在内存中构建代理对象。

​

​  代理对象不需要实现接口,但目标对象要实现接口。

更改后的项目

在这里插入图片描述

public interface Theacher {
    void teach();//上课
    void sayHello(String name);
}


public class SchoolTeacher implements Theacher{

    @Override
    public void teach() {
        System.out.println("老师在上课...");
    }

    @Override
    public void sayHello(String name) {
        System.out.println(name+" say Hello");
    }
}

Proxy

public class ProxyTeacher{

    private Object target; // 目标对象

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

    //给目标对象,生成一个代理对象
    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("JDK代理");

                        //反射机制调用目标对象的方法
                        Object result = method.invoke(target,args);

                        System.out.println("JDK代理完成");

                        return result;
                    }
                });
    }

    /*
        补充说明:
            public static Object newProxyInstance(ClassLoader loader,
                  Class<?>[] interfaces, InvocationHandler h)

           ClassLoader loader : 目标对象使用的类加载器,获取加载器的方法
           Class<?>[] interfaces:  目标的对象使用的接口类型,使用泛型方法确定类型
           InvocationHandler h: 事情处理,执行目标对象的方法时,对触发事情处理器方法,会把当前执行的目标对象方法作为参数传入
     */
}
public class Client {
    public static void main(String[] args) {
        //创建 老师(目标对象)
        SchoolTeacher st = new SchoolTeacher();

        //创建代理对象,同时把被代理对象传递给代理对象
        Theacher pt = (Theacher) new ProxyTeacher(st).getProxyInstance();

        //class com.sun.proxy.$Proxy0 内存中动态生成了代理对象
        System.out.println(pt.getClass());

        pt.sayHello("Tom");
        pt.teach();
        
    }
}

Cglib代理

 静态代理和JDK代理模式都要求对象是实现一个接口,但有时目标对象只是一个单独的类,并没有实现任何的接口,这时便可采用 目标对象子类来实现代理。

 Cglib是一个强大的高性能代码生成包,可以在运行期扩展java类与实现java接口,它被广泛应用于AOP框架中。

注:Cglib底层是使用字节码处理框架ASM来转换字节码并生成新的类

 实现要素:需要导入cglib的jar包

更改后的项目

在这里插入图片描述

public class Theacher {
    public String teach(){
        System.out.println("cglib代理");
        return "teaching...";
    }
}

Proxy

public class ProxyTeacher implements MethodInterceptor {

    private Object target; // 目标对象

    public ProxyTeacher(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(),会调用目标对象的方法
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws InvocationTargetException, IllegalAccessException {
        System.out.println("Cglib代理模式开始...");
        Object result = method.invoke(target,objects);
        System.out.println("Cglib代理模式结束...");

        return result;
    }
}
public class Client {
    public static void main(String[] args) {
        //创建 老师(目标对象)
        Theacher st = new Theacher();

        //创建代理对象,同时把被代理对象传递给代理对象
        Theacher proxy = (Theacher) new ProxyTeacher(st).getProxyInstance();

        String str = proxy.teach();
        System.out.println(str);
    }
}
魔兽世界怀旧服宏命令全解析:从自动换装到智能判定,老玩家才知道的黑科技 本文全面解析魔兽世界怀旧服宏命令的高级应用,从自动换装到智能判定,揭秘老玩家专属的黑科技技巧。深入探讨怀旧服特有的宏命令机制,包括施法队列、装备切换系统和职业专属技巧,帮助玩家在经典旧世版本中提升战斗效率。 阅读详情

相关推荐

影刀初级考试操作题2

题型E主要考察了Excel的操作,总体上难度不大,流程也很少。有些细节地方比如是追加还是覆盖,多试几次就没问题了。

weisili2012的博客 1万+

HTTP代理模式学习

强烈推荐下这篇文章,把代理模式说的很清楚了。这里我自己整理了一下并添加了一些其他的内容。 常用的代理技术分为正向代理,反向代理和透明代理。 一、正向代理 正向代理是一个位于客户端【用户A】和原始服务器【服务器B】之间的服务器【代理服务器Z】,为了从原始服务器取得内容,用户A向代理服务器Z发送一个请求并指定目标(服务器B),然后代理服务器Z向服务器B转交请求并将获得的内容返回给客户端。其中原始...

ming54ming的博客 2230

一文详解声码器

声码器(Vocoder)是语音信号处理领域的核心技术,其本质是通过“分析 - 参数化 - 合成” 的闭环流程,实现语音的高效编码、转换或生成。它不仅是早期语音通信的关键工具,更是现代 AI 语音技术(如 TTS、语音转换)的核心组件。以下从原理、技术分类、关键模块、应用及发展趋势展开详细解析。

weixin_41413777的博客 1354

代理学习

1、静态代理 测试类: package com.example.demo.proxy; public class StaticProxy implements UserDao { private UserDao userdao; public UserDao getUserdao() { return userdao; } ...

weixin_33807284的博客 284

基于 YOLOv26 的金属表面缺陷检测系统:智能视觉质检方案

摘要: 基于YOLOv26的金属表面缺陷检测系统采用深度学习技术,实现对划痕、裂纹、腐蚀等8类常见缺陷的自动化检测。系统通过数据增强预处理和YOLOv26模型的高精度识别能力,具备多类别分类、实时推理和强鲁棒性特点,适用于不同金属材质与光照条件。架构包含数据采集、预处理、YOLOv26检测和后处理模块,代码实现采用PyTorch框架,支持训练数据增强与标准化处理,为工业质检提供高效智能解决方案。

一键难忘的博客 589

【银河麒麟桌面系统】自定义ISO镜像操作实践

本文详细介绍了麒麟操作系统Kylin-Desktop-V10-SP1的ISO镜像定制流程。通过挂载原始镜像、解压文件系统、进入chroot环境进行系统定制(包括文件替换和软件管理),最终重构squashfs并生成新ISO。关键步骤包括:挂载镜像到mnt目录、解压filesystem.squashfs、替换源配置文件、在chroot环境中清理系统、重新生成squashfs文件以及使用mkisofs命令创建新镜像。文章特别标注了x86和ARM架构的不同命令参数,并提供了安装测试验证方法。整个过程展示了从原始镜像

信创运维工程师 · 银河麒麟 & 容器实战 | 金融生产环境迁移·等保加固 | 142篇原创·17万+阅读 2342

代理模式学习

什么叫做代理模式? 在我们日常生活中,就有非常多这样的例子,因为做任何事情,我们最开始只有一个目的,但是在达到目的的过程中,还有其他事情要做。 比如说我们要去租房子,我们最开始想的就是把钱给房东,房东给钥匙;当然房东也想的肯定是给你钥匙拿钱,但是实际上我们可能需要去看房,签合同等等很多东西,所有就产生了代理,也就是所谓的中介,他可以帮你完成其他的事情。 当然这样方便的事情在我们的代码中也会有体现: 创建租房接口: public interface zufang { void zf();

weixin_51980608的博客 206

DataCastle-租金预测

ID:编号;时间:房屋信息采集的时间;小区名:房屋所在小区,已脱敏处理;小区房屋出租数量:小区出租房屋数量,已脱敏处理;楼层:0、1、2分别表示楼层低,中,高;总层数:房屋所在建筑的总楼层数,已脱敏处理;房屋面积:房屋面积数值,已脱敏处理;房屋朝向:房屋的朝向;居住状态:房屋的居住状态,表示是否已出租或居住中,已脱敏处理;卧室数量:户型信息,数字表示卧室的个数;卫的数量:户型信息,数字表示卫生间的个数;厅的数量:户型信息,数字表示厅的个数;

优快云 精品推荐 3457

proxy学习笔记整理

proxy(代理)亦可理解为发言代表 syntax: const proxy = new Proxy(target, handle) 释义:proxy是生成的发言代表,target是需要被代表发言的对象,handle是发言代表需要遵守的规则,也是一个对象。 先抛一个小例子,热热身: const obj = {a:1} const handle = { get: function(target, propKey){ return '我就不告诉你!' } } const proxy = new Pro

weixin_43845044的博客 561

5.1 rocr-runtime libhsakmt event 机制全景—从 Doorbell 到 Signal

本文介绍了ROCm/KFD中的Event机制架构,主要解决GPU异步计算中的反馈问题。Event机制分为三层:硬件层触发事件,内核层管理事件通知,用户态接收处理。事件类型分为三大类:同步类事件(如SIGNAL、QUEUE_EVENT)用于任务完成通知,异常类事件(如MEMORY、HW_EXCEPTION)报告错误,拓扑类事件(如NODECHANGE)处理设备变更。该机制通过共享内存和中断实现高效通信,避免CPU轮询开销。后续文章将深入内核实现、Thunk层封装和多队列完成检测实战。

图形/计算GPU的驱动与虚拟化技术分享园地 1307

OWASP-ZAP扫描器的使用

目录 OWASP-ZAP 更新 代理 目录扫描 主动扫描(Active Scan) 扫描结果 生成报告 OWASP-ZAP OWASP Zed攻击代理(ZAP)是世界上最受欢迎的免费安全审计工具之一,由数百名国际志愿者积极维护。它可以帮助你在开发和测试应用程序时自动查找Web应用程序中的安全漏洞。 也可以说ZAP是一个中间人代理。它能够获取你对Web应用程序发出的所有请求以...

谢公子的博客 2万+

Proxy 代理模式学习

Java android 代理模式学习,这篇文章讲的挺详细的:https://blog.youkuaiyun.com/briblue/article/details/73928350

sxk874890728的博客 277

MATLAB基础应用精讲-【数模应用】游程检验(附MATLAB、R语言和python代码实现)

游程检验是一种非参数性统计假设的检验方法,它是游程总数检验和最大游程检验的总称,用于两个独立样本的比较和观测结果随机性的检验测试。​游程检验亦称“连贯检验”,是根据样本标志表现排列所形成的游程的多少进行判断的检验方法。[2]例1:设某样本n=12人的标志表现为男、女,有以下三种排列。(i) 男\男,女\女\女,男,女\女,男\男\男\男;(ii) 男\男\男\男\男\男\男,女\女\女\女\女;(iii) 男,女,男,女,男,女,男,女,男,女,男\男;连续出现男或女的区段称为游程。

qq_36130719的博客 608

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

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

灵台方寸山斜月三星洞 495

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

假人有限元模型

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

代理模式学习资源

大话设计模式(完整版):第七章 为别人做嫁衣——代理模式      代理模式学习博客:http://terrylee.cnblogs.com/archive/2006/05/18/403382.html

yulan1433096363的专栏 600

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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

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

hymanxq的专栏 494

怀旧版电脑GBC模拟器

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

Spring学习代理模式

首先我们先说下,为什么要学习代理模式?因为这就是SpringAOP底层。【SpringAOP和SpringMVC】 代理模式的分类 静态代理 动态代理 10.1,静态代理 角色分析: 抽象角色:一般会使用接口或者抽象类来解决 真实角色:被代理的角色 代理角色:代理真实角色,代理真实角色后,我们一般会做一些附属操作 客户:访问代理对象的人 代码步骤: 接口: //租房 public interface Rent { public void rent(); } 2.真..

dingtianliang的专栏 101

代理模式 -- 学习笔记

代理是一种设计模式,用户可以通过代理操作,而真正去进行处理的是我们的目标对象,代理可以在方法增强(如:记录日志,添加事务,监控等)拿一个例子说话。:接口,有个一保存用户的接口实现类如果现在提出一个需求,需要在Service方法上都要记录日志。那常规做法就是在方法上加上记录日志的逻辑。但是这样,如果接口有很多方法。那就要每一个方法都要去添加这段逻辑。这个时候就需要请我们的代理来做了,用户通过代理去调用方法,代理就去找目标方法去做事。

2301_79158740的博客 606

代理模式学习总结

目录 代理模式 引言 定义 模式类图 代理模式类型 远程代理 虚拟代理 图片代理 Copy-on-Write代理 保护代理 缓冲代理 防火墙代理 同步化代理 智能引用代理 动态代理 总结 模式优点 模式缺点 代理模式 引言 在某些情况下,一个客户不能或者不想直接引用一个对象,此时可以通过一个称之为“代理”的第三方来间接引用。代理可以在客户端和目标对象...

江川的博客 891

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

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

wzx77的博客 422

学习设计模式 - 代理模式

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

weixin_30606461的博客 109

Spring基础学习之代理模式

前言: 小伙伴们,大家好,我是狂奔の蜗牛rz,当然你们可以叫我蜗牛君,我是一个学习Java半年多时间的小菜鸟,同时还有一个伟大的梦想,那就是有朝一日,成为一个优秀的Java架构师。 这个Spring基础学习系列是用来记录我学习Spring框架基础知识的全过程 (这个系列是参照B站狂神的Spring5最新教程来写的,由于是之前整理的,但当时没有发布出来,所以有些地方可能有错误,希望大家能够及时指正!) 之后我将会以一天一更的速度更新这个系列,还没有学习Spring5框架的小伙伴可以参照我的博客学习一下;当然

weixin_45301250的博客 263

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

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

gnuhpc的专栏 2961

代理模式的学习总结

代理模式 静态代理 需要为每个代理者(类、接口)都创建一个代理类,让代理类继承或实现被代理者,重写被代理 者中的方法,重写之后就可以增加业务逻辑,还需要调用被代理者中的方法 动态代理 1、JDK自带实现多态代理的方法(Proxy) 1.1要求被代理类(目标类)需要实现一个接口 1.2、步骤 1.2.1、创建被代理者类的对象(目标对象) 1.2.2、获取目标类的类加载器:ClassLoader对象...

weixin_42278668的博客 449

六、代理模式学习总结

代理模式

shiyu_951的博客 1140
上一篇: 享元模式的学习
下一篇: 模板方法的学习
code_Floyed
博客等级 码龄7年 3粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值