代理模式--【学习笔记】

news2024/12/26 23:38:50

什么是代理模式?
代理是一种模式,提供了对目标对象的间接访问方式,即通过代理对象访问目标对象.如此便于在目标实现的基础上增加额外的功能操作,以满足自身的业务需求.

在这里插入图片描述

代理模式又分为静态代理,动态代理

静态代理模式

编写代理类, 要求: 代理类与目标类实现相同的接口, 代理类维护一个目标类对象, 目标方法由目标对象完成, 代理类作为额外的功能

图示:
在这里插入图片描述

代码演示:
目标类接口

/**
 * 工作接口
 */
public interface Work {
    //工作的方法
    public int work();
}

目标类:

/**
 * 目标类
 */
public class Worker implements  Work{

    @Override
    public int work() {
        System.out.println("工人正在工作...");
        return 0;
    }
}

代理类:

/**
 * 代理类  代理的Worker类
 *   能够代理实现Work接口所有的实现类
 */
public class AWorkerProxy implements Work {
    //目标类对象
    private Work  worker;  // 组合
    //构造
    public AWorkerProxy(Work  worker){
        this.worker = worker;
    }
    //set方式


    @Override
    public int work() {
        System.out.println("验证身份...");
        System.out.println("打上班卡");
        //调用目标类的目标方法
        int rs = worker.work();
        System.out.println("打下班卡");
        return rs;
    }
}

优点:
1.实现了不改变目录类前提, 增强目录的类的方法
2相对于继承来实现: 静态代理不需要使用继承, 节省类继承资源, 静态代理增强的某一接口所有实现类, 继承方式, 只能增强某一个类

缺点:
1.只能增强某一接口, 如果要增强多个不同接口的实现类, 创建多个代理类, 代理类暴增
2. 代码重复
3. 增强代码直接写在代理类方法中, 硬编码, 后期修改, 违背开闭原则

动态代理:基于JDK提供: Proxy

可以解决静态代理只能增强某一个接口,代码重复的问题;

首先可以看一下创建一个对象的过程

  1. 先编写Person.java
  2. 编译Person.java,生成Person.class 使用 javac
  3. 通过类加载器, 把Person.class 加载到内存
  4. 运行代码: java --> main(){new Person();}

图示:
在这里插入图片描述

根据图中的步骤2,执行java命令会启动JVM将字节码文件加载进内存,然后再根据Class对象来创建对象

图示:
在这里插入图片描述
顺序反过来看,如果我们想得到一个代理类对象,就需要有一个代理类的Class对象。
构造这个Class对象的思路:
1.首先我们要根据目标类的接口来创建一个架构一样的Class对象(空壳架构,JDK提供了Proxy类实现这个功能)
2.再将目标类中要增强的方法,增强类(用来给目标增加功能)中的方法整合在一起
3.最后再更具这个代理Class对象,创建实例

在这里插入图片描述
(图中未加上增强类的方法)

内部设计思路:
每次调用代理对象的方法都会调用invoke(),且invoke()的返回值就是代理方法的返回值。
在这里插入图片描述

代码演示:

 private  Object getProxy(Object target,Advice advice) throws  Exception{
        //第一步:通过Proxy类,创建一个和目标类接口一样的架构的Class对象
        //参数1:类加载器  参数2:目标类的接口
        Class<?> proxyClass = Proxy.getProxyClass(target.getClass().getClassLoader(),target.getClass().getInterfaces());
        //创建对象需要用到构造方法,但是Proxy生成的代理类对象的无参构造方法是私有的
        //只能调用调用下面的带参方法来创建实例
        Constructor<?> constructor = proxyClass.getDeclaredConstructor(InvocationHandler.class);
        //创建代理类实例
        Object proxy = constructor.newInstance(new InvocationHandler(){
            //method调用方法
            //proxy: 代理类对象
            //args: 方法参数
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                //第二步:将目标类中方法,和增强类中的方法组合在一起,形成一个新的方法
                advice.before();
                //调用目标对象的目标方法
                Object rs =  method.invoke(target,args);
                advice.after();
                return rs;
            }
        });
        //第三步:返回代理类对象(经过增强的代理类)
        return proxy;
    }

优点:

  1. 不改变目标类的代码, 对目标类的方法增强
  2. 代理各种不同的接口

缺点:

  1. 违背开闭原则: 增强代码虽然封装在一个一个增强类中,但是需要在invoke()方法,调用增强类的方法, 硬编码, 修改,需要修改invoke()方法
  2. 要求目标类必须实现某个接口, 基于接口的代理

解决方案:

解决1的方案: 使用配置文件/注解 替换硬编码 --> AOP(底层基于动态代理实现)

解决2的方案: 动态代理的第二种实现: 第三方: cglib, 代理类是目标类的子类, 这个类可以实现接口,也可以不实现接口

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

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

相关文章

【我爱世界杯】伪球迷眼里的世界杯

大家好&#xff0c;我是【架构师李肯】&#xff0c;一个专注于嵌入式物联网架构设计的攻城狮。 文章目录按理说聊一聊我和足球第一次热衷于关注世界杯后ying情时代的卡塔尔世界杯祝愿世界杯按理说 嗯&#xff0c;按理说&#xff0c;我一个程序猿&#xff0c;既不踢球&#xff…

ChatGPT原理解析-张俊林

本文将从以下几个方面展开&#xff1a; 引言 ChatGPT的技术原理 引言 作为智能对话系统&#xff0c;ChatGPT最近两天爆火&#xff0c;都火出技术圈了&#xff0c;网上到处都在转ChatGPT相关的内容和测试例子&#xff0c;效果确实很震撼。我记得上一次能引起如此轰动的AI技术…

湃睿PMDS-Fx传感器在电动牙刷上的应用

电动牙刷、冲牙器等产品市场的爆发性增长&#xff0c;显示全球人口正在越来越关注牙齿/口腔的健康问题。 根据资料显示&#xff0c;中国电动牙刷市场规模呈现逐年上涨的态势&#xff0c;2017年中国电动牙刷市场规模为43亿元&#xff0c;2021年中国电动牙刷市场规模上涨为125亿…

01-go基础-10-结构体 struct (定义结构体、声明结构体变量、结构体赋值、结构体做参数、结构体指针、结构体嵌套、结构体打印)

文章目录1. 定义结构体类型2. 声明结构体变量3. 赋值3.1 用结构体赋值3.2 每个成员分别赋值4. 结构体使用4.1 结构体作参数4.2 结构体指针做参数4.3 二者区别4.4 本质原因5. 结构体嵌套5.1 一个结构体作为另一个结构体的成员1&#xff09;定义2&#xff09;赋值和引用3&#xf…

RabbitMQ的学习

MQ引言 什么是MQ MQ(Message Quene)&#xff1a;翻译为消息队列&#xff0c;通过典型的生产者和消费者模型生产者不断向消息队列中生产消息&#xff0c;消费者不断的从队列中获取消息。因为消息的生产和消费都是异步的&#xff0c;而且只关心消息的发送和接收&#xff0c;没有…

【MySQL 原理篇】- 凭这个,我拿下字节面试

若是想查看原图&#xff0c;请点击这里 刘卡卡 | ProcessOn 超链接 索引 从存储结构上看&#xff0c;有哪些索引从存储结构上来划分&#xff1a;BTree索引&#xff08;B-Tree或BTree索引&#xff09;&#xff0c;Hash索引&#xff0c;full-index全文索引&#xff0c;R-Tree索…

[附源码]Python计算机毕业设计Django在线票务系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

JavaEE

文章目录前言JRE与JDK区别JAVASE、JAVAEE、JAVAME区别Dos常用命令为什么需要Path环境变量配置前言 &#x1f4cb;前言&#x1f4cb; &#x1f49d;博客&#xff1a;【无聊大侠hello word】&#x1f49d; ✍有一点思考&#xff0c;有一点想法&#xff0c;有一点理性&#xff01;…

关于有限元应力结果精度的几点讨论

1引言 作为一名汽车结构CAE工程师&#xff0c;使用有限元法进行应力分析是我多年的日常工作。但是关于有限元应力结果的一些技术点一直未能吃透&#xff0c;查到的相关文献也不多&#xff0c;文献内容也存在很多不尽不实之处。最近一段时间&#xff0c;抽空重新读了一遍王勖成…

泊松分布一

文章目录1. 泊松分布定义2.泊松分布具体实例实例1&#xff1a;实例2&#xff1a;3.生成泊松分布的代码泊松分布适合于描述单位间隔(时间、距离、面积、体积)内随机事件发生的次数的概率分布。如电话交换机接到呼叫的次数、汽车站台的候客人数、机器出现的故障数、自然灾害发生的…

【Android】用无障碍服务整个脚本——我看刑

本文灵感来源&#xff1a;李跳跳真实好友 app 目录无障碍服务(AccessibilityService)模拟点击组件ID & 组件文本坐标后台保活效果图存在缺陷缺陷一缺陷二缺陷三缺陷四无障碍服务(AccessibilityService) 无障碍服务(AccessibilityService)&#xff0c;是Google推出为了帮助…

从零搭建Sentry

前言 Sentry 为一套开源的应用监控和错误追踪的解决方案。这套解决方案由对应各种语言的 SDK 和一套庞大的数据后台服务组成。应用需要通过与之绑定的 token 接入 Sentry SDK 完成数据上报的配置。通过 Sentry SDK 的配置&#xff0c;还可以上报错误关联的版本信息、发布环境。…

四信机房环境监测方案上线 实现集中监控,统一管理

随着“东数西算”工程和新基建的加速落地&#xff0c;数智化技术正逐渐渗透到各领域。以机房行业为例&#xff0c;由于数据中心建设规模的逐步壮大&#xff0c;机房设备市场需求同步增长&#xff0c;为行业用户带来更多可能性。 伴随着机房中设备数量不断增多&#xff0c;如何…

Vue2实现浏览器ctrl+f功能

Vue2实现浏览器ctrlf功能 安装插件 使用一个Vue2的插件search-bar-vue2 npm install search-bar-vue2全局注册 //全局注册 import SearchBar from search-bar-vue2 Vue.use(SearchBar)局部注册 <template><div><search-bar :root"#app" :highlig…

【VUE】实现分页组件

&#x1f4d8;前言 &#x1f6a9;&#x1f6a9;&#x1f6a9; &#x1f48e;个人主页: 阿选不出来 &#x1f4a8;&#x1f4a8;&#x1f4a8; &#x1f48e;个人简介: 一名大二在校生,学习方向前端,不定时更新自己学习道路上的一些笔记. &#x1f4a8;&#x1f4a8;&#x1f4a…

Navigation--导航机理

1.ROS navigation为移动机器人导航相关包的集合&#xff0c;实现定位规划避障等相关功能。 整体工作流程为&#xff1a; 1.加载地图 navigation通过map_server加载现有地图。navigation无建图相关包&#xff0c;需另外实现后保存&#xff0c;默认只支持2维地图&#xff0c;其…

[附源码]Python计算机毕业设计Django游戏商城平台论文

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;我…

推荐测试用例管理工具,看这篇就行。

我们在考虑测试用例管理的时候&#xff0c;其实不能单纯考虑测试用管理&#xff0c;因为你的测试用例是需要和需求关联起来的&#xff0c;是需要和 bug 关联起来的。在有些行业&#xff0c;比如汽车、医药&#xff0c;不仅要对需求进行测试&#xff0c;还需要对架构设计、详细设…

某CCF C会议对国内和国外作者实行两套标准, 引27%+中稿者发声!

点击文末公众号卡片&#xff0c;不错过计算机会议投稿信息 本文主要反映轻松参会交流群内UIC22(CCF C类) 的81位国内中稿作者的诉求&#xff08;占UIC22中稿数的27%&#xff09;。目前群内作者们的诉求为&#xff0c;希望国内作者可选择线上参会。因为线下参会有困难&#xff0…

2023年湖北监理工程师报考时间是什么时候?

2023年湖北监理工程师报考时间是什么时候&#xff1f; 监理工程师考试时间虽说是全国统一的&#xff0c;但是监理工程师报名时间不统一&#xff0c;每个省份自行安排报名时间&#xff0c;监理工程师报名时间基本都是在2.3月份开始报名&#xff0c;具体关注每个省人事考试院网站…