设计模式|代理模式

news2024/11/22 6:34:49

代理模式介绍

​代理模式指为其他对象提供一种代理,以控制对这个对象的访问。在某些情况下,一个对象若不能直接引用另一个对象,而代理对象可以在客户端与目标对象之间起到中介的作用。

代理模式使用场景

普通代理

普通代理模式是指在代理模式中,代理对象和真实对象都实现了相同的接口或继承了相同的抽象类。代理对象将请求转发给真实对象,并可以对请求进行一些额外处理。

普通代理模式由三个组成部分:抽象主题、具体主题和代理。

1. 抽象主题(Subject)定义了真实主题和代理之间共有的接口,客户端通过该接口访问真实主题和代理。

2. 具体主题(RealSubject)实现了抽象主题的接口,定义了真实的业务逻辑。

3. 代理(Proxy)实现了抽象主题的接口,并持有一个真实主题的引用。代理负责管理真实主题的创建、销毁和访问,并可以在访问真实主题前后添加一些额外的逻辑。

// 抽象主题interface Subject {  void request();}// 具体主题class RealSubject implements Subject {  @Override  public void request() {    System.out.println("RealSubject: Handling request.");  }}// 代理class Proxy implements Subject {  private RealSubject realSubject;  @Override  public void request() {    if (realSubject == null) {      realSubject = new RealSubject();    }    preRequest();    realSubject.request();    postRequest();  }  private void preRequest() {    System.out.println("Proxy: Preparing request.");  }  private void postRequest() {    System.out.println("Proxy: Cleaning up after request.");  }}// 客户端public class Client {  public static void main(String[] args) {    Subject proxy = new Proxy();    proxy.request();  }}

普通代理模式通过使用额外的代理层来控制对真实对象的访问,并可以在访问前后添加额外的处理逻辑,从而提供更多的控制和灵活性。

动态代理

动态代理模式是一种在运行时创建代理对象的机制,与普通代理模式相比,它更加灵活和通用。在动态代理模式中,代理类不需要预先定义,而是在程序运行时根据需要动态生成。

动态代理模式由以下两个要素组成:

1. InvocationHandler 接口:该接口定义了代理类需要实现的方法,即代理类在处理方法调用时需要进行的操作。代理类通过实现 InvocationHandler 接口来自定义对被代理对象方法的调用规则。

2. Proxy 类:该类提供了一个静态方法来创建代理对象。它接收一个 ClassLoader 对象、一个 Class 数组和一个 InvocationHandler 对象作为参数,并返回一个代理对象。

import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;// 定义一个接口interface Subject {    void request();}// 实现接口的具体类class RealSubject implements Subject {    @Override    public void request() {        System.out.println("RealSubject: Handling request.");    }}// 创建动态代理类class ProxyHandler implements InvocationHandler {    private Object realObject;    public ProxyHandler(Object realObject) {        this.realObject = realObject;    }    @Override    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        System.out.println("ProxyHandler: Preparing request.");        Object result = method.invoke(realObject, args);        System.out.println("ProxyHandler: Cleaning up after request.");        return result;    }}public class Client {      public static void main(String[] args) {        // 创建真实主题对象        Subject realSubject = new RealSubject();        // 创建代理处理器对象并传入真实主题对象        ProxyHandler handler = new ProxyHandler(realSubject);        // 使用 Proxy.newProxyInstance() 方法动态生成代理对象        Subject proxy = (Subject) Proxy.newProxyInstance(                Client.class.getClassLoader(), new Class[]{Subject.class}, handler);        // 调用代理对象的方法        proxy.request();    }}

我们定义了一个接口 Subject 和具体类 RealSubject,创建了一个代理处理器 ProxyHandler,它会在访问真实主题对象前后执行一些额外的逻辑。接着,我们使用 Proxy 类的静态方法 newProxyInstance() 来创建代理对象,并将代理处理器和真实主题对象传递给它。

当客户端调用代理对象的 request() 方法时,代理处理器会先执行一些额外的逻辑,然后将请求转发给真实主题对象进行处理。在处理完成后,代理处理器还会再次执行一些额外的逻辑。

动态代理模式允许在运行时动态生成代理对象,并通过代理处理器来控制对被代理对象的访问。相比于普通代理模式,它更加灵活和通用。

代理模式应用得非常广泛,大到一个系统框架、企业平台,小到代码片段、事务处理,稍不留意就用到代理模式。可能该模式是大家接触最多的模式,而且有了AOP大家写代理就更加简单了,有类似Spring AOP和AspectJ这样非常优秀的工具,拿来主义即可!不过,大家可以看看源代码,特别是调试时,只要看到类似$Proxy0这样的结构,你就应该知道这是一个动态代理了。

- END -


下方扫码关注 软件质量保障,与质量君一起学习成长、共同进步,做一个职场最贵Tester!

  • 关注公众号, 后台回复【测开】获取测试开发xmind脑图

  • 扫码加作者, 获取加入测试社群!

往期推荐

聊聊工作中的自我管理和向上管理

经验分享|测试工程师转型测试开发历程

聊聊UI自动化的PageObject设计模式

细读《阿里测试之道》

我在阿里做测开

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

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

相关文章

C++的string类使用介绍

string类 1.为什么要学习string类?1.1.C语言中的字符串1.2. 日常中 2. 标准库中的string类2.2 string类(对于单字节的字符)的常用接口说明①string常见的构造函数②string类对象的容量操作③string类对象的访问以及遍历操作④string类对象的修改操作⑤string类非成员…

OrCAD怎样把原理图输出为DXF格式

OrCAD怎样把原理图输出为DXF格式 又有段时间没分享文章了,想想主要还是自媒体写点内容确实不容易,要不断坚持下来更不容易,一直以来也就是凭着“乐于分享”的心在不定时更新。 今天分享的主题是:OrCAD怎样把原理图输出为DXF格式…

标准CSO

Cheng R, Jin Y. A competitive swarm optimizer for large scale optimization[J]. IEEE transactions on cybernetics, 2014, 45(2): 191-204. 1.1 背景介绍 CSO(competitive swarm optimizer)算法是在PSO(particle swarm optimization&a…

医日健“数智药房”解锁购药新模式

“现在买药这么方便,半夜拉肚子过来自助付款、自助取药,还能连线医生,很快就买好了药。”上海市宝山区消费者王先生惊喜地说。近日,宝山区一国大药房医日健 “智慧药房”正式上线营业,该药房实现自助式、无接触就医购药…

如何添加团队成员到你的项目

本文介绍在YonBuilder移动开发中,如何把你的团队成员添加到你的应用中,让团队成员也具备应用的相关配置,代码拉取,打包编译等功能权限。 简单来说把「团队成员添加到你的项目」,一共需要三步大流程操作,具…

基于AT89C51单片机的篮球比赛计时计分器

点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87778138?spm1001.2014.3001.5503 源码获取 主要内容: 比赛的计分和计时的工具大多是很简陋的比分牌,十分的不方便。而且大多由于缺少24秒…

Meta-learning综述

文章目录 几个概念1)监督、无监督、弱监督学习(Weakly Supervised Learning)以及 自监督学习(Self-supervised Learning)2)域偏移、域适应、域泛化3)N-way K-shot(Few-shot learning…

【Java虚拟机】JVM诊断神器Arthas入门实操

1.Arthas简介快速入门 阿里开源的Java诊断工具,它可以在运行时对Java应用程序进行动态诊断和调试 当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?我改的代…

国考省考行测:数字推理题2

国考省考行测:数字推理题2 2022找工作是学历、能力和运气的超强结合体! 公务员特招重点就是专业技能,附带行测和申论,而常规国考省考最重要的还是申论和行测,所以大家认真准备吧,我讲一起屡屡申论和行测的重要知识点 …

改进YOLOv8 | 特征融合篇 | YOLOv8 应用 BiFPN 结构 | 《 EfficientDet: 可扩展和高效的目标检测》

模型效率在计算机视觉中变得越来越重要。在本文中,我们系统地研究了目标检测中的神经网络架构设计选择,并提出了几种关键的优化方法来提高效率。首先,我们提出了一种加权双向特征金字塔网络(BiFPN),它可以实现简单快速的多尺度特征融合;其次,我们提出了一种复合缩放方法…

从期望最大化(EM)到变分自编码器(VAE)

本文主要记录了自己对变分自编码器论文的理解。 Kingma D P, Welling M. Auto-encoding variational bayes[J]. arXiv preprint arXiv:1312.6114, 2013. https://arxiv.org/abs/1312.6114 1 带有潜在变量的极大似然估计 假设我们有一个有限整数随机数发生器 z ∼ p θ ( z ) …

Linux | 学习笔记(适合小白)上

操作系统概述: 计算机是由硬件和软件这两个主要部分组成的操作系统是软件的一类,主要作用是协助用户调度硬件工作,充当用户和计算机硬件之间的桥梁常见的操作系统:PC端:Windows,Linux,MacOS&…

电子邮件市场中,如何使用您的Gmail?

Gmail凭借其直观的界面、慷慨的免费存储空间(与其他Google工具共享15 GB,如Google Drive和Photos)以及作为常规Gmail账户附加的各种免费生产力工具,在电子邮件市场占据主导地位。但是,人们对Google如何使用您的电子邮件…

决策引擎平台建设方案

文档修订历史 时间版本主要内容2023.05.12v1.0.0初始化 1. 概述 1.1 需求 1.1.1 需求背景 当同一个业务场景中,有非常多的业务分支后,需要有非常多的 if 判断,来承载这些简单的业务逻辑,但随着业务的发展,业务逐渐…

Java --- redis7之大数据统计之Bitmap

目录 一、大数据统计之Bitmap 1.1、面试题 1.2、京东签到领取京豆 一、大数据统计之Bitmap 1.1、面试题 1、日活统计 2、签到打卡 3、最近一周的活跃用户等 1.2、京东签到领取京豆 一个月的签到天数,连续签到数 方案1:使用MySQL来实现(小项目) …

NTLM 中继攻击的几种非主流玩法

在企业组织中的常见的一种安全风险是凭证重用,当攻击者攻击 NT LAN Manager 身份验证协议(以下简称 NTLM 身份验证)时就会出现这样的风险,而这个协议通常会在 微软的 活动目录 中默认启用。 NTLM 认证中的不安全性已经被安全研究人员发现超过15年了。该…

使用Vue CLI脚手架

章节概述: 使用Vue CLI脚手架初始化脚手架分析脚手架结构render函数修改默认配置ref属性props配置项mixin混入plugin插件scoped样式Todo-List案例WebStorage自定义事件绑定解绑全局事件总线消息的订阅与发布$nextTick过渡与动画 提示(我没有使用markdo…

c++ 常用总结(二)

1. ① 可变参数... 、__VA_ARGS__与##__VA_ARGS__ 结论:##__VA_ARGS__中##的作用就是去掉前面多余的,号 ,在使用自定义打印的时候,推荐##__VA_ARGS__而不是__VA_ARGS__ C语言##__VA_ARGS__的用法_fengwang0301的博客-CSDN博客 例1 __VA…

良心推荐!数学建模基础知识-MATLAB快速上手,最适合新手学习的Matlab快速入门教程

目录 1. 如何打开matlab的文件 第一种方法: 第二种创建脚本文件的方法。 2. 如何运行一段代码 写在命令行 写在脚本 3.some tips about matlab 工作区储存的数据 如何加入断点&如何终止运行&代码分节 1. 如何打开matlab的文件 我们写的源代码可以…

探索对抗样本生成方法:保护机器学习模型的安全性

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…