设计模式——–代理模式

代理模式:为其他对象提供一种代理以控制对这个对象的访问。

最简单的代理模式,分为三种角色:

抽象主题角色:代理类与被代理共同实现的接口,内部定义了最普通的业务类型。

具体主题角色:被代理类,具体实现接口的方法。

代理主题角色:代理类,继承主题接口,并生成与被代理类方法名一致的方法,并且调用被代理类的方法。

代理模式的扩展

1、普通代理

调用者只能调用代理对象,并且只知道代理对象类型,不知被代理对象类型。

2、强制代理

必须通过实例化被代理对象,然后通过被代理对象的指定的代理对象进行方法调用。

代理类不仅仅可以实现主题接口,也可以实现其他接口完成不同的任务,而且代理的目的是在目标对象方法的基础上作增强,这种增强的本质通常就是对目标对象的方法进行拦截和过滤。

动态代理

动态代理是在实现阶段不用关心代理谁,而在运行阶段才指定代理哪一个对象。使用JDK提供的动态代理接口InvocationHandler对被代理类的方法进行代理。

真实主题实现主题类接口

所有的动态代理实现方法都通过invoke的方法调用。

调用 newProxyInstance(c.getClassLoader(),c.getInterfaces,InvocationHandler h)方法, 重新生成了一个对象,c.getInterfaces找到了类的所有接口,然后实现了接口的所有方法,但是方法都是空的,这些方法都由InvocationHandle方法来接管。

Original: https://www.cnblogs.com/maple92/p/6675911.html
Author: Topze
Title: 设计模式——–代理模式

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

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

(0)

大家都在看

  • 4.7 Linux压缩文件或目录中文件为.bz2格式(bzip2命令)

    bzip2 命令同 gzip 命令类似,只能对文件进行压缩(或解压缩),对于目录只能压缩(或解压缩)该目录及子目录下的所有文件。当执行压缩任务完成后,会生成一个以”.b…

    Linux 2023年6月7日
    0117
  • 配置管理docker对象和守护进程

    使用 Docker 的主要工作是创建和使用各类对象:镜像、容器、网络、卷等。 1、Docker对象的标记 标记(Label):是一种将元数据应用于Docker对象(镜像、容器、网络…

    Linux 2023年6月8日
    086
  • 基本数据类型的长度

    32位机器和64位机器中int、char等数据类型所占字节长度对比。 在32位机器和64机器中int类型都占用4个字节。编译器可以根据自身硬件来选择合适的大小,但是需要满足约束:s…

    Linux 2023年6月13日
    094
  • Logback 日志框架

    Logback 是由 Log4j 创始人设计的又一个开源日志组件。作为流行的 Log4j 项目的继承者,在 log4j 1.x 停止的地方接手。其架构非常通用,可以在不同的情况下应…

    Linux 2023年6月8日
    0103
  • 操作系统实现-进入内核

    博客网址:www.shicoder.top微信:18223081347欢迎加群聊天 :452380935 这一次我们正式进入内核,编写相关的内核代码,也就是kernel代码 数据类…

    Linux 2023年6月13日
    0104
  • gem 更换源及目前能用的源

    1.查看gem源 gem source -l 2.删除源 gem source -r 3.添加源 gem sources –add Original: https://…

    Linux 2023年6月8日
    0108
  • SpringBoot-Mybatis

    SpringBoot 整合 Mybatis SpringBoot-Mybatis 10.1 导入 MyBatis 所需要的依赖 org.mybatis.spring.boot my…

    Linux 2023年6月14日
    092
  • 顺序栈

    #pragma once #ifndef _SEQSTACK_ #define _SEQSTACK_ #include using namespace std; typedef i…

    Linux 2023年6月7日
    085
  • 十六.大数据平台及组件安装部署

    Hadoop全分布部署 Hadoop集群验证 使用jps查看各个节点启动的进程情况 [hadoop@master ~]$ jps 2224 ResourceManager 2487…

    Linux 2023年6月8日
    0122
  • Python中import外部模块全局变量修改规则及踩坑

    最近碰到一个import外部文件全局变量修改后未符合预期效果的问题,简要描述如下: 有env.py, test.py, dal.py三个文件,env.py 中定义了DEBUG=Fa…

    Linux 2023年6月6日
    077
  • Pyinstaller打包教程

    由于用户使用Python脚本的时候可能没有运行环境,所以需要打包。记录下碰到的问题。 安装 pip install –upgrade pyinstaller 安装最新开发版 pi…

    Linux 2023年6月13日
    061
  • TCP 和 UDP 协议简介

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

    Linux 2023年6月16日
    0169
  • 五、用户管理

    id root查看用户uiduid 0管理员uid 1-999系统账号uid 1000-60000普通账号gid 0 管理组gid 1-999 系统组gid 1000-60000 …

    Linux 2023年6月7日
    082
  • Linux虚拟机追加扩展磁盘

    一、使用VMware给虚拟机追加磁盘 使用VMware打开虚拟机设置对话框,选择硬盘,点击右侧的扩展按钮,输入扩展后的磁盘容量。 点击扩展按钮。提示磁盘已成功扩展。 二、对闲置的空…

    Linux 2023年6月6日
    0120
  • redis client-output-buffer-limit 设置

    Redis 缓存保护机制: 大小限制,当某一客户端缓冲区超过设定值后直接关闭连接 持续时间限制,某一客户端缓冲区持续一段时间占用过大空间时关闭连接 对于普通客户端来说,限制为0,也…

    Linux 2023年5月28日
    096
  • 简单易用的任务队列-beanstalkd

    概述 beanstalkd 是一个简单快速的分布式工作队列系统,协议基于 ASCII 编码运行在 TCP 上。其最初设计的目的是通过后台异步执行耗时任务的方式降低高容量 Web 应…

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