静态代理和动态代理

news2024/7/6 19:30:59

静态代理和动态代理

    • 代理模式
    • 代理模式的主要优缺点:
          • 优点:
          • 缺点:
    • 代理模式的编写要点
    • 静态代理实现步骤
        • 静态代理方式的弊端
    • 动态代理:
    • 动态代理的实现步骤:

代理模式

 代理模式的定义:由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。

代理模式的主要优缺点:

优点:
  • 代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用;
  • 代理对象可以扩展目标对象的功能;
  • 代理模式能将客户端与目标对象分离,在一定程度上降低了系统的耦合度;
缺点:
  • 在客户端和目标对象之间增加一个代理对象,会造成请求处理速度变慢;
  • 增加了系统的复杂度;

代理模式的编写要点

  1. 和被代理对象实现相同的接口

  2. 在代理类中,需要对被代理对象初始化

  3. 需要实现和被dialing对象相同的方法,并且在这个方法中核心(原始)业务调用被代理对象的,增强的业务在这里进行增强就行了

静态代理实现步骤

  1. 定义业务接口(代理类和被代理类都要实现此接口)
public interface Person {
    void eat();
}
  1. 创建被代理类实现业务接口
public class Student implements Person{
    @Override
    public void eat() {
        System.out.println("学生在买饭");
    }
}
  1. 创建代理类实例化被代理类并实现业务接口
public class Teacher implements Person{

    private Student s ;

    public Teacher(){
        this.s = new Student();
    }

    @Override
    public void eat() {
        s.eat();
    }
}

  1. 主方法调用代理类
public class Test {
    public static void main(String[] args) {
        Teacher t = new Teacher();
        t.eat();
    }
}

  1. 实现被代理类的业务

在这里插入图片描述

静态代理方式的弊端

  1. 如果有很多个对象需要找代理,那么就需要实现很多个对象的代理类,这样的话代码臃肿,用户体验很一般;
  2. 如果被代理的方法过多,每个方法都需要增强,代码不整洁,大量搬用的工作 它有这两大缺陷就造成了写大型项目的时候,就不会用静态代理这个设计模式

动态代理:

在程序执行过程中,使用jadk的反射机制,创建代理类对象,并动态的指定要代理目标类。
动态代理是使用jd的反射机制,创建对象的能力,创建的是代理类的对象。而不用你创建类文件。不用写java文件。

动态代理的实现步骤:

  1. 创建接口,定义目标类要完成的功能
public interface Person {
    void eat();
}

  1. 创建目标类实现接口
public class Student implements Person{
    @Override
    public void eat() {
        System.out.println("学生去买饭");
    }
}

  1. 创建InvocationHandler接口的实现类,在invoke方法中完成代理类的功能
    1.调用目标方法
    2.增强功能
public class Teacher implements InvocationHandler {

    private Person person;
    
    public Object prxy() {
 		return Proxy.newProxyInstance(person.getClass().getClassLoader(),
 									person.getClass().getInterfaces(),this);
    }

    public Teacher(Person person) {
        this.person = person;
    }
    //	1.调用目标方法
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //	2.增强功能
        System.out.println("老师要吃饭");
        System.out.println("小花给我买饭去");
        method.invoke(person,args);
        System.out.println("老师吃饭了");
        return null;
    }
}
  1. 使用Proxy类的静态方法,创建代理对象。并把返回值转为接口类型。
public class Test {
    public static void main(String[] args) {
        Student student = new Student();
        Teacher teacher = new Teacher(student);
        Person ob = (Person)teacher.prxy();
        ob.eat();
    }
}

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

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

相关文章

Javascript 基础知识学习

Javascript 基础知识学习 参考自:https://www.w3cschool.cn/javascript/ javascript 简介 JavaScript 是互联网上最流行的脚本语言,这门语言可用于 HTML 和 web,更可广泛用于服务器、PC、笔记本电脑、平板电脑和智能手机等设备。 JavaScri…

计算流体力学的基本方法简介(有限差分法、有限元法、有限体积法)

1、有限差分法: 原理,用差商代替微商; 优缺点: 2、有限元方法: 有限元剖分方法: 特点: 3、有限体积法: 两种方式,格心格式和格点格式: 特点:

基于html的美食网站——速水果介绍8页(HTML+CSS+JavaScript) 带论文

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材,DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 家精彩专栏推荐 美食网页介绍 | 甜品蛋糕 | 地方美食小吃文化 | 餐饮文化 | 等网站的设计与制作 | 美食主题网站 | HTML期末大学生网页设计作业 HTML&…

SpringCloud全系列知识(1)——初识微服务和注册中心

SpringCloud(微服务)相关笔记 一 基础框架图 1.微服务技术栈 2.技术栈分类 二 认识微服务 1.单体架构 将业务功能集中在一个项目中,打成一个包部署。 优点:架构简单,部署成本低。 缺点:耦合度高 2.分布式架构 根据业务功能…

最具影响力的15颗国外开放数据气象卫星介绍

1.热带降雨测量任务(TRMM) TRMM 是 NASA 和日本宇宙航空研究开发机构 (以前称日本国家空间发展署) 的合作项目,是 NASA 地球科学计划中的航天任务。日本提供运载火箭和测雨雷达,而由 NASA 提供卫星、4台仪器和卫星运行系统。 TRMM 卫星是三轴稳定的&…

深度强化学习中利用Q-Learngin和期望Sarsa算法确定机器人最优策略实战(超详细 附源码)

需要源码和环境搭建请点赞关注收藏后评论区留下QQ~~~ 一、Q-Learning算法 Q-Learning算法中动作值函数Q的更新方向是最优动作值函数q,而与Agent所遵循的行为策略无关,在评估动作值函数Q时,更新目标为最优动作值函数q的直接近似,故…

深入理解java虚拟机:虚拟机类加载机制(2)

文章目录3.类加载器3.1 类与类加载器3.2 双亲委派模型3.3 破坏双亲委派模型3.类加载器 虚拟机设计团队把类加载阶段中的通过一个类的全限定名来获取描述此类的二进制字节流这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个…

【密码学篇】数字签名基础知识(无保密性)

【密码学篇】数字签名基础知识(无保密性) 数字签名主要用于确认数据的完整性、签名者身份的真实性和签名行为的不可否认性等。—【蘇小沐】 文章目录【密码学篇】数字签名基础知识(无保密性)1.数字签名定义2.数字签名原理3.数字签…

Apache-DBUtils实现CRUD操作

Apache-DBUtils实现CRUD操作 每博一文案 有人说,不要轻易去伤害任何一个人,因为你会因此而受伤。欠的债,躲不掉,总是要还的。 要知道,哪些能被你欺骗的人,都是无条件相信你的人,因为心里有你&a…

【LeetCode-中等】240. 搜索二维矩阵 II(详解)

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/…

ROS之话题通信自定义msg

文章目录背景自定义msg例子1.定义msg文件2.编辑配置文件3.编译话题通信自定义msg调用A(C)0.vscode 配置1.发布方2.订阅方3.配置 CMakeLists.txt4.执行背景 在 ROS 通信协议中,数据载体是一个较为重要组成部分,ROS 中通过 std_msgs 封装了一些原生的数据…

【软考软件评测师】第三十三章 数据库系统应用

【软考软件评测师】第三十三章 数据库系统应用 【软考软件评测师】第三十三章 数据库系统应用【软考软件评测师】第三十三章 数据库系统应用第一部分 知识点集锦1.关系数据库候选码2.自然连接3.元祖关系1)1对多关系2)多对多关系3)复合属性4&a…

Centos8界面语言怎么设置? Centos用户界面语言的设置方法

Centos8怎么给用户设置界面语言?想要设置界面语言,该怎么设置呢?下面我们就来看看详细的教程。 1、Gnome桌面环境下,在桌面空白处右键选择【设置】。 2、在【设置】中点【详细信息】。 3、之后点【用户】。 4、首先单击选中要设置…

ADS原理图到Layout,Layout更新原理图

RF Design-22 目录方法1:自动生成Generate/update Layout将理想元件转换为带footprint的元件统一修改元件参数生成Layout添加传输线,T节由Layout更新原理图Ground pouring覆铜设置地过孔方法2:place components from schem to Layout将原理图…

一种无需调查船上坞的调查设备安装测量方法和安装测量系统

本文来自于博主发明专利的技术交底。 大型科考船船底安装大型的精密测量设备,对安装的测量精度要求比较高,通过上坞,采用传统的测量方式,先做控制网,然后进行碎步测量,得到测量设备及其室内附属设备与船舶的…

Spring Cloud Ribbon面试题大全

Spring Cloud Ribbon面试题大全 目录 文档索引 面试题汇总 Q:Ribbon的总体流程? Q:Ribbon如何选择调用哪个实例? Q:服务列表的获取过程? Q:Ribbon如何避免调用失效实例? Q&am…

JavaScript高级复习上(59th)

1、类 constructor 构造函数 constructor() 方法是类的构造函数(默认方法),用于传递参数,返回实例对象,通过new命令生成对象实例时,自动调用该方法。如果没有显示定义,类内部会自动给我们创建一个 constru…

【CPP】string 类的模拟实现

​🌠 作者:阿亮joy. 🎆专栏:《吃透西嘎嘎》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 目录👉前言&…

Angular 学习 之 Hello World !

目录 0.前言・前提(Angular介绍) 前言 前提(node.js已经按照) 1.安装・查看版本 2.创建・启动Angular工程 2.1.创建工程 2.2.启动工程 2.3.启动之后,浏览器访问,显示的效果 2.4.工程目录结构 3.各…

计算机毕业设计——基于html汽车商城网站页面设计与实现论文源码ppt(35页) HTML+CSS+JavaScript

常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他等网页设计题目, A…