设计模式–Proxy模式

这篇主要介绍 代理模式相关内容,主要是一些基本概念普及。

代理模式

1、什么是代理模式?

代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问。[DP]

通俗的说就是指客户端并不直接调用实际的对象,而是通过代理对象,来间接调用实际的对象。
2、实现原理

设计模式--Proxy模式
Subject: 可以是接口,也可以是抽象类
Proxy: 内部含有对真实对象RealSubject的引用,负责对真实主题角色的调用,并在真实主题角色处理前后做预处理和后处理
proxied: 真实主题角色,业务逻辑的具体执行者
3、代理模式应用
  • 远程代理,为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实[DP]。例如RPC远程调用。
  • 虚拟代理,根据需要创建开销很大的对象。通过它来存放实例化需要很时间的真是对象[DP]。例如浏览器使用虚拟代理来代替真实的图片,代理中存储图片的大小和路径,待到下载优化的目的。
  • 安全代理,用来控制真实对象访问时的权限[DP]。例如权限控制。
  • 智能指引, 是指当调用真实的对象时,代理处理另外一些事情。代理类本身并不真正实现服务,而是同过调用委托类的相关方法,来提供特定的服务。真正的业务功能还是由委托类来实现,但是可以在业务功能执行的前后加入一些公共的服务。例如我们想给项目加入缓存、日志这些功能,我们就可以使用代理类来完成,而没必要打开已经封装好的委托类。典型应用例如SpringAop、日志收集、过滤器等等。
4、创建形式

主要分 静态代理动态代理

1、静态代理

静态代理其实就是代理类和被代理对象的关系在程序运行前已经确定好了(代码已经写好了),创建过程如下:

  1. 定义业务接口;
  2. 被代理类实现业务接口;
  3. 定义代理类并实现业务接口;
  4. 最后便可通过客户端进行调用。(这里可以理解成程序的main方法里的内容)

这样一来就会带来如下弊端:

  • 如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法,增加了代码维护的复杂度
  • 静态代理中,目标类与其代理类是一一对应的。但是,会存在这样的情况:有N个类型不同的目标类,但是代理类中的”预处理、后处理”都是相同的,仅仅是调用目标类不同。若采用静态代理,那么必然需要手动创建N个代理类,很麻烦
2、动态代理

动态代理在运行期为各个目标类分别生成代理类,共享”预处理,后处理”功能,不需要事先知道目标对象的类型,这样可以大大减小程序规模。动态主要有两种,一种jdk动态代理,另外一种是cglib代理。这里限于篇幅,下篇学习笔记再总结。

参考资料:

Original: https://www.cnblogs.com/xieshuang/p/10892703.html
Author: 河岸飞流
Title: 设计模式–Proxy模式

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/571666/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • LeetCode随缘刷题之最短补全词

    package leetcode.day_12_10; import org.junit.Test; public class ShortestCompletingWord0748…

    Java 2023年6月7日
    067
  • Linux磁盘操作命令

    挂载硬件设备 Mount 用于挂载文件系统 “mount /dev/cdroom /media/cdroom” -a 挂载所有在/etc/fstab 中定义…

    Java 2023年6月7日
    074
  • 应用配置管理,基础原理分析

    工程可以有点小乱,但配置不能含糊; 一、配置架构 在微服务的代码工程中,配置管理是一项复杂的事情,即需要做好各个环境的配置隔离措施,还需要确保生产环境的配置安全;如果划分的微服务足…

    Java 2023年6月15日
    078
  • uboot常用命令及其使用

    ? 或者 help 第一次使用uboot,通过?查看所有帮助信息 ?cmd 或者 help cmd ? bootz #查看bootz命令的帮助信息 通过该命令查看某个cmd的帮助信…

    Java 2023年6月6日
    050
  • SpringBoot整合MyBatis

    一、准备工作 首先新建一个空工程,springboot相关的整合都放在该工程下。 该空工程名称为spring-boot-example 创建好的空工程如下: 接着我们创建模块 注:…

    Java 2023年6月8日
    073
  • 【Java面试手册-算法篇】给定一个正整数,请找出小于这个数字的所有回文数字

    首先来看看回文数字的定义 : 回文数字:设n是一任意自然数,若将n的各位数字反向排列所得自然数n1与n相等,则称n为一回文数。比如12321、666是回文数字,而1234不是回文数…

    Java 2023年6月8日
    082
  • 「免费开源」基于Vue和Quasar的前端SPA项目crudapi后台管理系统实战之模块管理(十四)

    基于Vue和Quasar的前端SPA项目实战之模块管理(十四) 回顾 通过之前一篇文章基于Vue和Quasar的前端SPA项目实战之动态表单(五)的介绍,通过配置的方式可以零代码实…

    Java 2023年6月6日
    082
  • 简单易懂的进程与线程详解

    进程与线程详解 本博客分以下几个部分来阐述进程与线程 1、进程的概念很抽象?那么什么是进程呢? 2、开启一个进程,操作系统会做哪些工作? 3、既然进程也可以使多个程序能并发执行,为…

    Java 2023年6月5日
    079
  • Fizz网关入门教程-路由初体验

    概念 路由就是定义网关如何处理请求,分反向代理、服务发现、服务编排三种类型。 配置 路由的定义可通过网关管理后台完成: 下面分别介绍反向代理和服务发现路由的配置,设网关部署为 1….

    Java 2023年6月9日
    071
  • BlogJava好像不能贴图

    BlogJava好像不能贴图,就贴在这里了. Original: https://www.cnblogs.com/sunsonbaby/archive/2005/05/05/149…

    Java 2023年5月29日
    073
  • CSS相关知识及入门

    修饰HTML页面,美化 CSS代码规范 CSS选择器 就是以HTML中的标签名作为选择器名称 选择CSS代码作用于对应标签名的标签上 适用于将相同样式作用于多个同名标签上 给相应的…

    Java 2023年6月6日
    061
  • ZendFramework学习第二章(Json)

    使用Zendframework中的Zend_Json组件可以实现PHP对象与JSON对象之间的转换。 json是一种轻量级的数据交换格式。 轻量级: 1.这种格式不需要特定的容器。…

    Java 2023年5月29日
    083
  • (Java初学篇)IDEA项目新建流程和软件配置优化以及怎么彻底删除项目

    相信很多小伙伴们在初学 Java 时都会出现这样的情况,就是在网上一顿搜索加捣鼓终于把 JDK 和IDEA 这两款软件安装配置好,但是发现面对这个陌生的软件此时却无从下手,那么接下…

    Java 2023年6月15日
    0120
  • 形参与实参的定义与区别

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/SuperAx/p/13177798.htmlAutho…

    Java 2023年6月5日
    077
  • springboot引入三方jar包打包报错问题解决

    (1)jar包放项目中(如下图) (2)修改依赖配置 加入: <dependency> <groupId>cn.newhopegroupId> &lt…

    Java 2023年5月30日
    0102
  • TCP 和 UDP 协议简介

    一、TCP TCP(Transmission Control Protocol),传输控制协议,对”传输、发送、通信”进行”控制”的…

    Java 2023年6月7日
    068
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球