java设计模式学习之【代理模式】

news2024/9/24 7:22:10

文章目录

  • 引言
  • 代理模式简介
    • 定义与用途
    • 实现方式
  • 使用场景
  • 优势与劣势
  • 在Spring框架中的应用
  • 图片加载示例
  • 代码地址

引言

在现实生活中,我们经常使用代理来处理我们不想直接参与或无法直接参与的事务,例如,使用律师来代表法庭上的案件。在软件开发中,这种代理概念同样存在,被称为代理模式。代理模式允许我们通过创建一个替代对象(代理),来控制对其他对象的访问。这种模式在需要控制或增强对对象的访问时非常有用。

代理模式简介

定义与用途

代理模式(Proxy Pattern)是一种结构型设计模式,它通过提供一个替代对象(代理)来代表真实对象的操作。代理控制对原始对象的访问,可以在访问对象时添加一些附加操作,例如访问控制、延迟初始化、日志等。

实现方式

实现代理模式通常涉及以下几个关键组件:

  • 主题接口(Subject): 定义了代理和真实对象的共用接口,这样在任何使用真实对象的地方都可以使用代理。
  • 真实主题(Real Subject): 定义了代理所表示的真实对象。
  • 代理(Proxy): 维护一个对真实主题的引用,控制对真实主题的访问,并可以在访问前后添加额外的处理。

使用场景

代理模式适用于以下场景:

  • 当需要在不修改原始对象的情况下控制对对象的访问时。
  • 当需要为一个对象提供不同的访问控制层时,如为远程对象提供本地代表。
  • 当需要添加对象的创建和销毁的额外逻辑时,如实现延迟初始化。

例如:

  1. 远程代理(Remote Proxy):为远程对象(如网络服务)提供本地的代理对象。
  2. 虚拟代理(Virtual Proxy):用于延迟昂贵操作的对象的创建,直到真正需要该对象时。
  3. 保护代理(Protection Proxy):控制对原始对象的访问,适用于对象应有不同访问权限的场景。

优势与劣势

  • 优势
    分离任务:代理可以将复杂或耗时的工作从真实对象中分离出去。
    增加安全性:通过代理控制对真实对象的访问,增加安全层。
    扩展功能:在不改变真实对象代码的情况下增加额外功能。
  • 劣势
    增加代码复杂性:引入代理会增加系统的复杂性。
    可能会导致一些延迟:尤其是在远程代理的情况下。

在Spring框架中的应用

Spring框架广泛使用了代理模式,特别是在以下方面:

Spring AOP(面向切面编程):使用代理模式来实现方法拦截和增强,实现例如事务管理、安全检查等横切关注点。

事务管理:Spring通过代理模式管理事务,为方法调用提供声明式事务支持。

Spring Security:在安全框架中,代理用于在方法调用之前和之后执行安全检查。

图片加载示例

在这里插入图片描述
步骤 1:创建接口
首先定义了一个 Image 接口,用于展示图片。

public interface Image {
   void display();
}

步骤 2:实现具体类
创建了 RealImage 类,实现了 Image 接口。这个类代表实际加载的图片。

public class RealImage implements Image {

   private String fileName;

   public RealImage(String fileName){
      this.fileName = fileName;
      loadFromDisk(fileName);
   }

   @Override
   public void display() {
      System.out.println("展示 " + fileName);
   }

   private void loadFromDisk(String fileName){
      System.out.println("加载 " + fileName);
   }
}

创建了 ProxyImage 类,也实现了 Image 接口。这个类是 RealImage 对象的代理,负责在需要时加载图片。

public class ProxyImage implements Image {

   private RealImage realImage;
   private String fileName;

   public ProxyImage(String fileName){
      this.fileName = fileName;
   }

   @Override
   public void display() {
      if(realImage == null){
         realImage = new RealImage(fileName);
      }
      realImage.display();
   }
}

步骤 3:使用代理对象
ProxyPatternDemo 类演示了如何使用 ProxyImage 来获取和展示 RealImage 对象。

public class ProxyPatternDemo {
	
   public static void main(String[] args) {
      Image image = new ProxyImage("test_10mb.jpg");

      // 图片将从磁盘加载
      image.display(); 
      System.out.println("");
      
      // 图片不会从磁盘重新加载
      image.display(); 	
   }
}

在这里插入图片描述

在这个示例中,ProxyImage 充当 RealImage 的代理。当第一次调用 display 方法时,ProxyImage 会创建一个 RealImage 对象并调用其 display 方法。当再次调用 display 方法时,由于 RealImage 对象已经创建,代理将直接使用已加载的对象,而不会再次从磁盘加载图片。

这种方式可以节约资源,特别是在处理大型资源(如大图片)时。通过使用代理模式,只有在实际需要时才加载资源,从而优化了性能并减少了内存占用。

代码地址

23种设计模式相关代码后续会逐步提交到github上,方便学习,欢迎指点:
代码地址
https://github.com/RuofeiSun/lf-23Pattern

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

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

相关文章

2023微博AIGC算法工程师一面 面试题

来源:投稿 作者:LSC 编辑:学姐 一面 35min左右,主要是根据简历发问的 1.自我介绍 介绍实习项目, 聊的比较详细,但是我实习项目限制比较多,做的不够深入。 2.多标签分类的损失函数 多标签分类任务&#x…

SOLIDWORKS Motion运动平台减速运动分析

SOLIDWROKS motion是SOLIDWORKS中一个高性能的插件,能够帮助设计中完成虚拟样机的仿真分析工具,motion既可以对众多的机械结构进行运动学和动力学仿真,同时也可以反馈机械设备的速度、加速度、作用力等,在SOLIDWROKS motion完成样…

ArrayList与顺序表(带完整实例)

【本节目标】 1. 线性表 2. 顺序表 3. ArrayList的简介 4. ArrayList使用 5. ArrayList的扩容机制 6. 扑克牌 1.线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表…

骨灰级程序员那些年曾经告诉我们的高效学习的态度

一、背景 以前阅读陈皓老师的左耳听风专栏中关于如何高效学习的总结让我收货颇丰,今天总结了一下,分享给大家 老师说: 学习是一件“逆人性”的事,就像锻炼身体一样,需要人持续付出,会让人感到痛苦&#…

PFA气体吸收瓶耐强酸PFA洗气瓶PFA鼓泡瓶特点分析

洗气瓶的别称有多种,取决于不同的地区和行业。以下是一些常见的别称: 1. 清洗瓶:因其主要用途是清洗气体样品而得名。 2. 干燥瓶:用于干燥气体样品的容器。 3. 气体净化瓶:用于净化气体样品的设备。 4. 气体清洗器…

再回首感知损失在low-level上的应用

《Perceptual Losses for Real-Time Style Transfer and Super-Resolution》是李飞飞团队在2016年发表于ECCV的文章。我近几年的工作中,所训练的模型都离不开感知损失。不得不感慨,大佬之所以是大佬,就是因为他们开创性的工作很多年后依然为人…

淘宝api接口测试方式(item_get-获得淘宝商品详情)

注册淘宝开放平台账号:首先,你需要在淘宝开放平台上注册一个账号,并创建一个应用。获取App Key和Secret Key:在创建应用后,你会获得App Key和Secret Key,这些凭证将用于调用API。了解淘宝商品详情接口&…

探索性能测试的奥秘:流程与工具大揭秘!

一、性能测试 性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。 1.1 类别 性能测试包括负载测试、压力测试、基准测试等。 1.1.1 负载测试 通过测试系统在资源超负荷情况下的表现,以发现设计上的错误或验证…

PCL点云处理之反算两块点云的放缩比例 (二百二十三)

PCL点云处理之反算两块点云的放缩比例 (二百二十三) 一、算法介绍二、算法实现1.代码2.结果一、算法介绍 在 PCL点云处理之等比例放大与缩小点云尺寸(七十二)一章中,介绍了如何等比例放大缩小一块点云,这里介绍如何反算得到两片经过放缩的点云之间的比例,这种计算方法应…

事务隔离级别:保障数据库并发事务的一致性与性能

目录 引言 1. 事务隔离级别概述 2. 读未提交隔离级别 3. 读已提交隔离级别 4. 可重复读隔离级别 5. 串行化隔离级别 6. 保障事务隔离级别的机制 7. 如何选择合适的隔离级别 8. 结语 引言 在数据库管理系统(DBMS)中,事务隔离级别是一…

【开源软件】最好的开源软件-2023-第18名 OpenTelemetry

自我介绍 做一个简单介绍,酒架年近48 ,有20多年IT工作经历,目前在一家500强做企业架构.因为工作需要,另外也因为兴趣涉猎比较广,为了自己学习建立了三个博客,分别是【全球IT瞭望】,【…

Qt之Ui样式表不影响子类的配置

Qt之Ui样式表不影响子类的配置 问题 在ui界面上布局时,当对容器进行样试设计时,会对容器内其它成员对象也进行了修改 分析 对应*.ui文件内容 从这个写法来看,它的样式属性会影响其成员对象样式属性。 解决方法 在容器的样式表中写时适…

Numpy 实现C4.5决策树

C4.5 信息增益比实现决策树 信息增益比 g R ( D , A ) g ( D , A ) H ( D ) g_{R}(D, A)\frac{g(D, A)}{H(D)} gR​(D,A)H(D)g(D,A)​ 其中, g ( D , A ) g(D,A) g(D,A)是信息增益, H ( D ) H(D) H(D)是数据集 D D D的熵 代码实现 import numpy as …

AI全栈大模型工程师(二十四)常用的超参

文章目录 七、先介绍几个常用的超参7.1、过拟合与欠拟合7.2、学习率调整策略八、自然语言处理常见的网络结构8.1、文本卷积神经网络 TextCNN8.2、循环神经网络 RNN8.3、Attention (for RNN)后记七、先介绍几个常用的超参 7.1、过拟合与欠拟合 奥卡姆剃刀: 两个处于竞争地位的…

Kafka事务是怎么实现的?Kafka事务消息原理详解(文末送书)

目录 一、Kafka事务性消息1.1 介绍Kafka事务性消息1.2 事务性消息的应用场景1.3 Kafka事务性消息的优势 二、Kafka事务性消息的使用2.1 配置Kafka以支持事务性消息生产者配置消费者配置 2.2 生产者:发送事务性消息创建Kafka生产者开始事务发送消息提交或中止事务 2.…

MATLAB 最小二乘直线拟合方法二 (36)

MATLAB 最小二乘直线拟合方法二 (36) 一、算法介绍二、算法实现1.代码2.结果一、算法介绍 这里介绍另一种拟合直线点云的方法,更为简单方便,结果与前者一致,主要内容直接复制代码使用即可,原理简单看代码即可,下面是具体的实现和拟合结果展示 二、算法实现 1.代码 代…

wappalyzer基于插件的网站开发技术解析工具

一、wappalyzer 解释:这是一款强大的工具,其主要能提供一种快速、可靠地检测网站所使用技术栈的方法,也就说说,服务器发来的信息都会被它剖析,然后分析出前端的技术栈,有时后端所使用的技术栈如果网页特征…

华为配置策略路由(基于IP地址)示例

组网需求 如图1所示,汇聚层Switch做三层转发设备,接入层设备LSW做用户网关,接入层LSW和汇聚层Switch之间路由可达。汇聚层Switch通过两条链路连接到两个核心路由器上,一条是高速链路,网关为10.1.20.1/24;另…

ASF-YOLO开源 | SSFF融合+TPE编码+CPAM注意力,精度提升!

目录 摘要 1 Introduction 2 Related work 2.1 Cell instance segmentation 2.2 Improved YOLO for instance segmentation 3 The proposed ASF-YOLO model 3.1 Overall architecture 3.2 Scale sequence feature fusion module 3.3 Triple feature encoding module …

汇总大厂-校招/社招 Java面试题--持续补充更新中-大家别光收藏,要看起来,巩固基础,就是干呀!

** 接上篇-汇总大厂-校招/社招 Java面试题(补充) ** markdown文件。持续更新中(阿里、腾讯、网易、美团、京东、华为、快手、字节…) 上面这篇也结合着看啊,通宵给整理出来的。 如需下载整套资料。关注公众号后台。…