代理模式Proxy

news2024/9/22 3:57:08
一、代理模式(Proxy)
1.代理模式的定义

代理模式给某一个对象提供一个代理对象,并由代理对象控制对真实对象的访问,起到对代理对象已有功能的增强

通俗的来讲代理模式就是我们生活中常见的中介。

2.作用
  • 中介隔离作用:在某些情况下,一个客户类不想或者不能直接引用一个委托对象,

而代理类对象可以在客户类和委托对象之间起到中介的作用,其特征是代理类和委托类实现相同的接口。

  • 开闭原则,增加功能:代理类除了是客户类和委托类的中介之外,我们还可以通过给代理

类增加额外的功能来扩展委托类的功能,这样做我们只需要修改代理类而不需要再修改委托类,符合代码设计的开闭原则。

3.代理模式的分类

我们有多种不同的方式来实现代理。如果按照代理创建的时期来进行分类的话可以分为两种:

  • 静态代理:

静态代理是由程序员创建或特定工具自动生成源代码,在对其编译。在程序员运行之前,代理类.class文件就已经被创建了。

  • 动态代理:

动态代理是在程序运行时通过反射机制动态创建的。

    • 动态代理分为:

基于接口的动态代理(jdk自带)

基于子类的动态代理(第三方)

二、静态代理

所谓“静态 ”也就是在程序运行前就已经存在代理类的字节码文件,代理类和被代理对象的关系在运行前就确定了。

1.定义接口

interface ISinger{
    public void sing();
}

2.定义被代理类

public class SingerImp implements Isinger{
    @Override
    public void sing(){
        Systm.out.println("===莫等闲===");
    }
}

3.定义代理类

public class SingerProxy implements Isinger{
    Isinger realsinger;
    
    public SingerProxy(Isinger realsinger) {
        this.realsinger = realsinger;
    }
    
    @Override
    public void sing(){
        Systm.out.println("大家好");
        realsinger.sing();
        Systm.out.println("谢谢");
    }
}

4.定义客户端,查看执行结果

public class Test {
    public static void main(String[] args) {
        //1.创建被代理对象
        Isinger realsinger = new SingerImp();
        //2.创建代理
        Isinger proxysinger = new SingerProxy(realsinger);

        proxysinger.sing();
    }
}

输出结果:

大家好

莫等闲

谢谢

从上面的代码可以看出,静态代理存在被代理类和代理类之间耦合度过高。

三、动态代理

“动态”代理的源码是在程序运行期间由 JVM 根据反射等机制动态的生成,所以在运行前并不存在代理类的字节码文件。

1.使用JDk

1.1 定义接口

interface ISinger{
    public void sing();
}

1.2 定义被代理类

public class ZhaoYiTing implements ISinger{
    @Override
    public void sing() {
        System.out.println("===易燃易爆炸===");
    }
}

1.3 定义客户端,查看执行结果

public class test01 {
    public static void main(String[] args) {
        //1.创建被代理对象
        ISinger zhaoYiTing = new ZhaoYiTing();
        //2.创建代理对象
        ISinger jinjiren = (ISinger)Proxy.newProxyInstance(zhaoYiTing.getClass().getClassLoader(), zhaoYiTing.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                //功能增强
                System.out.println("===自我介绍===");

                Object obj = method.invoke(zhaoYiTing, args);
                return obj;
            }
        });
        jinjiren.sing();
    }
}

输出结果:

===自我介绍===

===易燃易爆炸===

2.使用第三方(CGLIB)

2.1 定义接口

interface ISinger{
    public void sing();
}

2.2 定义被代理类

public class ZhaoYiTing implements ISinger{
    @Override
    public void sing() {
        System.out.println("莫等闲");
    }
}

2.3 定义客户端,查看执行结果

public class test {
    public static void main(String[] args) {
        ISing imp = new tenggeerImp();
        ISing jin = (ISing)Enhancer.create(imp.getClass(), imp.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
                Object obj = method.invoke(imp, objects);
                return obj;
            }
        });
        jin.sing();
    }
}

输出结果:

莫等闲

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1994288.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024 年的 Node.js 生态系统

数据来源于 Node.js Toolbox,网站展示了 Node.js 生态系统中积极维护且流行的库。

在 Duo S 上使用 TDL SDK 高效部署人脸检测模型

TDL SDK 是一款集成算法开发包,提供了便捷的编程接口,使开发者们能够更快、高效地将各种深度学习技术应用于自己的产品和服务中。无论开发者是否是深度学习领域的专家,有了TDL SDK作为助手,都能轻松构建智能应用。 Milk-V DuoS 是…

7.4.分支限界法概率算法近似算法数据挖掘算法智能优化算法

了解,没有考过,基本上不会考 分支限界法 分支限界法:与回溯法类似,同样是在问题的解空间树上搜索问题解的一种算法,它常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。回溯…

【AI大模型】LangChain框架:示例选择器与输出解析器携手,编织NLP高效精准之网

文章目录 前言一、示例选择器1.介绍及应用2.自定义示例选择器案例:AI点评姓名 3.基于长度的示例选择器案例:对输入内容取反 4.基于最大边际相关性(MMR)的示例选择器案例:得到输入的反义词 5.基于n-gram重叠的示例选择器6.综合案例 二、输出解…

深入探索String AOP想详情

一.AOP的概述 AOP是Spring框架的第⼆⼤核⼼(第⼀⼤核⼼是IoC) Q:什么是AOP? A:Aspect Oriented Programming(⾯向切⾯编程) 什么是⾯向切⾯编程呢? 切⾯就是指某⼀类特定问题, 所以AOP也可以理解为⾯向特定⽅法编程. 什么是⾯向特…

鸿蒙HarmonyOS开发:@Observed装饰器和@ObjectLink装饰器:监听嵌套类对象属性变化

文章目录 一、装饰器二、概述三、限制条件四、装饰器说明五、Toggle组件1、子组件2、接口3、ToggleType枚举4、事件 六、示例演示1、代码2、效果 一、装饰器 State装饰器:组件内状态Prop装饰器:父子单向同步Link装饰器:父子双向同步Provide装…

Linux云计算 |【第二阶段】NETWORK-DAY1

主要内容: 计算机网络概述、网络拓扑结构、OSI参考模型、eNSP、交换机及原理 一、计算机网络概述 计算机网络是指将多台计算机或设备通过通信线路连接起来,以便它们能够相互交换信息和共享资源的系统。计算机网络的目的是实现数据通信和资源共享&#…

生成式人工智能安全评估体系构建

文章目录 前言一、人工智能安全治理的现状1.1 国际安全治理现状1.2 国内安全治理现状二、构建人工智能安全评估体系1.1 需要对生成式人工智能技术的安全性、可靠性、可控性、公平性等维度进行全面的考量。1.2 应对生成式人工智能全维度风险。1.3 在体系化应对框架中,应明确法律…

[Meachines] [Easy] Traverxec Nostromo RCE+SSH-私钥RSA解密+journalctl权限提升

信息收集 IP AddressOpening Ports10.10.10.165TCP:22,80 $ nmap -p- 10.10.10.165 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION …

nfc苹果手机怎么开启?3招就教会你

在数字化时代,nfc技术已成为智能手机的一项重要功能,它让我们的设备能够进行无线数据交换,实现便捷的移动支付、文件传输等操作。那么,nfc苹果手机怎么开启呢?如果你想要充分利用这一技术,那么本文将为你提…

git推送错误-->远程分支比本地的分支更新,无法直接推送

每次上传本地修改好的代码的时候,十次有八次都会出现这样的问题!!(暴躁!!!) 现在写个帖子记录一下,这个问题目前我还没有解决,欢迎懂的佬指点一下. 情景: 我在本地仓库做了一些代码的修改,准备上传到远程仓库上,下边是上传步骤: git add . # 将所有的修改都提交到缓冲区git …

免费获取!Windows10 32位纯净版:无捆绑更安全!

今日,系统之家小编给大家分享2024最新的Windows10纯净版32位系统,该版本系统不包含任何捆绑软件,系统资源占用少,运作流畅,适合老旧电脑安装。系统安装起来特别简单,推荐大家使用硬盘安装,即便是…

大黄蜂能飞的起来吗?

Bumblebee argument 虽然早期的空气动力学证明大黄蜂不能飞行——因为体重太重,翅膀太薄,但大黄蜂并不知道,所以照飞不误。 背景 在20世纪初,‌科学家们通过研究发现,‌大黄蜂的身体与翼展的比例失调,‌按照…

OpenAI Embedding效果表现不佳:那如何评估选择Embedding?

OpenAI Embedding效果表现不佳 对文本进行Embedding是大模型应用中必不可少的一步, 虽然大模型OpenAI是最好的, 但OpenAI的Embedding却不是。本文Embedding评估的具体流程, 代码, 以及结论。 如果仅关心代码 & 结论&#xf…

软件项目质量管理体系,软件评审,资质认证,安全建设及项目管理匹配资料(原件参考)

软件项目质量管理体系是指一套系统化的管理方法、流程、工具和文档,旨在确保软件项目从需求分析、设计、开发、测试到部署和维护的整个生命周期中,都能达到预定的质量标准和客户期望。该体系通过明确的角色和责任、标准化的工作流程、有效的质量控制和持…

NC 找到搜索二叉树中两个错误的节点

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 描述 一棵二叉树原…

Windows系统下的MATLAB 虚拟机中Ubuntu系统的ROS通讯

在Windows系统下的MATLAB与虚拟机中Ubuntu系统的ROS进行通讯,主要涉及到网络配置、环境变量设置以及MATLAB与ROS的接口调用。以下是一个详细的步骤说明: 一、网络配置 设置虚拟机网络: 确保虚拟机(Ubuntu系统)的网络…

7-3 单机多卡并行

一台机器可以安装多个GPU(1-16)在训练和预测时,我们将一个小批量计算切分到多个GPU上来达到加速的目的 同样一个小批量,让用多个GPU同时运行来一起完成这个计算梯度的过程常用的切分方案有 数据并行 模型并行 通道并行&#xff…

中国中医科学院某医院:监控易7.0开启一体化运维新篇章

在首都北京的医疗领域中,中国中医科学院某医院作为佼佼者,一直致力于为患者提供高质量的医疗服务。然而,随着医院业务的不断扩展和IT系统的日益复杂,如何确保IT基础资源的稳定运行,成为了医院面临的一大挑战。为了应对…

Java继承细节

目录 继承给编程带来的便利 细节1 案例演示 细节2 案例演示 细节3 案例演示 细节4 案例演示 细节5 细节6 细节7 案例演示 细节8 细节9 细节10 继承给编程带来的便利 提高了代码的复用性,代码的扩展性与维护性。 细节1 子类继承了所有的属性和方法…