当前位置:

首页 > 编程开发 > Java的代理模式怎么理解

Java的代理模式怎么理解

代理模式:静态代理有时候,我们可能不想直接面对某事或者某人,这样我们就可以找一个中介的人去替我们做,比如送礼物叫跑腿、找保洁上某某同城等等。这样对方也不知道中介的背后是谁参与,起到一个中介作用和保护目标对象的作用,这就是代理模式。也就是有一个中介代替你去做。1、代理模式的定义由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介简单结构图:2、代理模式的优缺点优点:1.在客户端与目标对象之间起到一个中介作用和保护目标

本文目录

      代理模式:静态代理

      有时候,我们可能不想直接面对某事或者某人,这样我们就可以找一个中介的人去替我们做,比如送礼物叫跑腿、找保洁上某某同城等等。这样对方也不知道中介的背后是谁参与,起到一个中介作用和保护目标对象的作用,这就是代理模式。也就是有一个中介代替你去做。

      Java的代理模式怎么理解

      1、代理模式的定义

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

      简单结构图:

      Java的代理模式怎么理解

      2、代理模式的优缺点

      优点:

      1.在客户端与目标对象之间起到一个中介作用和保护目标对象的作用

      2.可以扩展目标对象的功能

      3.能将客户端与目标对象分离,在一定程度上降低了系统的耦合度,增加了程序的可扩展性

      缺点:

      1.会造成系统设计中类的数量增加(因为多了一个或者多个中介类(代理))

      2.在客户端和目标对象之间增加一个代理对象,会造成请求处理速度变慢

      3.增加了系统的复杂度

      3、代理模式的分类

      代理模式分为静态代理(本文)和动态代理(下一篇文章):

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

      • 动态: 在程序运行时,运用反射机制动态创建而成

      4、静态代理模式的结构 

      1.抽象主题类: 通过接口或抽象类声明真实主题和代理对象实现的业务方法

      2.真实主题类: 实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象

      3.代理类: 提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问、控制或扩展真实主题的功能

      代码演示:

      定义一个抽象主题:

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

      /**
       *抽象主题
       */
      
      public interface Subject {
          void Request();
      }

      真实主题:

      /**
       *真实主题类:实现抽象主题
       */
      public class RealSubject implements Subject{
          @Override
          public void Request() {
              System.out.println("您的航班正在飞行");
          }
      }

      代理类:

      //代理类,实现抽象类的接口
      public class Proxy implements Subject{
      
          private RealSubject realSubject;
      
          @Override
          public void Request() {
              //先判断是否存在真实主题RealSubject
              //如果没有,就新建一个
              if(realSubject == null){
                  realSubject = new RealSubject();
              }
      
              //预处理,使用这个方法
              preRequest();
      
              //去访问真实主题类的方法
              realSubject.Request();
      
              //代理类的后续方法
              postRequest();
          }
      
          private void preRequest() {
              System.out.println("航班马上起飞啦");
          }
      
          private void postRequest() {
              System.out.println("航班到达目的地,感谢乘坐");
          }
      
      
      }

      测试类:

      public class Test {
          public static void main(String[] args) {
      
              //使用代理去访问RealSubject里面的Request
              Proxy proxy = new Proxy();
              proxy.Request();
          }
      }

      输出结果:

      航班马上起飞啦
      您的航班正在飞行
      航班到达目的地,感谢乘坐

      通过上面的演示,用来一个代理类去访问了真实主题类的方法,这样测试类就不知道到底是谁来访问的,是代理类呢还是代理类后面还有其他人,这样就可以很好的保护对象。这也是代理模式的优点。

      静态代理的总结:

      可以在不修改目标对象的功能前提下,对目标实现功能扩展,但是代理对象需要与目标对象实现一样的接口,所以会有很多代理类,当代理类很多的时候,维护的复杂度就会变大,那么该怎么解决这个问题呢?那就需要使用动态代理。

      5、代理模式的应用场景

      当无法或不想直接引用某个对象或访问某个对象存在困难时,可以通过代理对象来间接访问。使用代理模式主要有两个目的:一是保护目标对象,二是增强目标对象

      该应用场景总结参考自互联网:

      • 远程代理,这种方式通常是为了隐藏目标对象存在于不同地址空间的事实,方便客户端访问。例如,用户申请某些网盘空间时,会在用户的文件系统中建立一个虚拟的硬盘,用户访问虚拟硬盘时实际访问的是网盘空间

      • 虚拟代理,这种方式通常用于要创建的目标对象开销很大时。例如,下载一幅很大的图像需要很长时间,因某种计算比较复杂而短时间无法完成,这时可以先用小比例的虚拟代理替换真实的对象,消除用户对服务器慢的感觉

      • 安全代理,这种方式通常用于控制不同种类客户对真实对象的访问权限

      • 智能指引,主要用于调用目标对象时,代理附加一些额外的处理功能。例如,增加计算真实对象的引用次数的功能,这样当该对象没有被引用时,就可以自动释放它

      • 延迟加载,指为了提高系统的性能,延迟对目标的加载。例如,Hibernate 中就存在属性的延迟加载和关联表的延时加载

      本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
      作者最新文章
      编程开发 Java
      相关文章 更多
      Java单元测试入门:使用JUnit 5编写第一个测试用例
      Java单元测试入门:使用JUnit 5编写第一个测试用例

      面向初学者的JUnit 5实用入门指南。从测试概念、Maven依赖配置,到手把手编写首个单元测试用例及断言验证,助你掌握Java单元测试的核心流程。

      Java变量未初始化报错解析:局部变量与成员变量默认值差异
      Java变量未初始化报错解析:局部变量与成员变量默认值差异

      深入解析Java中局部变量未初始化编译报错与成员变量自动赋予默认值的机制差异,涵盖JVM内存分配、编译期确定性赋值检查与实际排查修复方案。

      Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat
      Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat

      详细讲解在Java中获取当前系统时间并进行格式化输出的两种核心方案:基于Java 8全新日期时间API的DateTimeFormatter与传统遗留的SimpleDateFormat,包含完整代码示例、线程安全机制对比及生产选型建议。

      Java中final与static final常量的定义及初始化规则
      Java中final与static final常量的定义及初始化规则

      深入解析Java中final变量与static final常量的定义、内存语义、初始化时机及合法赋值路径,涵盖编译期常量优化与实战避坑指南。

      Java抽象方法与接口方法的区别及选型建议
      Java抽象方法与接口方法的区别及选型建议

      深入对比Java中抽象类抽象方法与接口方法的语法演进、设计意图及运行期差异,并提供清晰的架构选型决策流程与实战范例。

      Java实现HTTP请求与JSON解析的完整代码示例
      Java实现HTTP请求与JSON解析的完整代码示例

      本文提供Java标准库HttpClient发起HTTP GET/POST请求并结合Jackson进行JSON数据反序列化与序列化的完整代码示例与工程实践指南。

      Java递归出现StackOverflowError的原因分析及栈空间优化方案
      Java递归出现StackOverflowError的原因分析及栈空间优化方案

      详细分析Java递归调用出现StackOverflowError的原因,结合代码说明线程栈、栈帧和递归深度之间的关系,并介绍终止条件排查、迭代改写、减少栈帧开销以及通过-Xss调整JVM栈空间的方法。

      Java空指针异常(NPE)的代码排查与修复实例
      Java空指针异常(NPE)的代码排查与修复实例

      针对Java中常见的NullPointerException(NPE),本文从堆栈日志定位、典型代码触发场景、具体修复代码对比到防御体系进行系统讲解,提供实用且易上手的排查与修复方案。

      selenium上传文件教程本地文件路径设置方法
      selenium上传文件教程本地文件路径设置方法

      深入解析Selenium处理文件上传的技术细节,涵盖标准HTML控件的路径直接注入法与非标准控件的系统级模拟方案,提供Windows与Linux环境下的路径设置最佳实践及常见异常排查。

      大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景
      大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景

      针对大数据工程场景,系统对比Java、Scala与Python在执行性能、生态结合、开发效率和维护成本上的核心差异,给出清晰的架构选型依据与落地方案。

      查看更多
      精品专题 更多
      装机必备
      装机必备

      正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

      Windows
      Windows

      正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

      PDF教程
      PDF教程

      正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

      Mac软件 更多
      讯飞智作 网页版
      讯飞智作 网页版
      Windows/ macOS/ Linux

      讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

      火山引擎 网页版
      火山引擎 网页版
      Windows/ macOS/ Linux

      火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

      Aperty macOS版
      Aperty macOS版
      macOS

      Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

      WINDOWS 更多
      讯飞智作 网页版
      讯飞智作 网页版
      Windows/ macOS/ Linux

      讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

      火山引擎 网页版
      火山引擎 网页版
      Windows/ macOS/ Linux

      火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

      PixTV 网页版
      PixTV 网页版
      Windows

      PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。