Java二十三种设计模式-代理模式模式(8/23)

代理模式:为对象访问提供灵活的控制

引言

代理模式(Proxy Pattern)是一种结构型设计模式,它为其他对象提供一个代替或占位符,以控制对它的访问。

基础知识,java设计模式总体来说设计模式分为三大类:

(1)创建型模式,共5种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

(2)结构型模式,共7种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

(3)行为型模式,共11种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

第一部分:代理模式概述

1.1 定义与用途

代理模式的基本定义

代理模式是一种结构型设计模式,其核心思想是为一个对象提供一种代理,以控制对这个对象的访问。代理模式可以在不修改目标对象的基础上,通过引入一个代理层来间接操作实际对象,从而实现对目标对象的访问控制、延迟初始化、日志记录、权限校验等功能。

解释为何需要代理模式

访问控制:在某些情况下,我们可能需要对某些对象的访问进行控制,比如限制访问频率、权限验证等。代理模式可以为实际对象提供一个访问控制层,从而实现这些需求。

延迟初始化:有些对象的创建可能是资源密集型的,比如涉及到复杂的计算或者I/O操作。通过代理模式,我们可以延迟对象的初始化,直到真正需要使用时才创建实际对象。

增加额外功能:代理模式可以在不修改实际对象的情况下,为其增加额外的功能,比如日志记录、性能监控、事务处理等。这种方式比修改原有对象的代码更加灵活和安全。

远程代理:在分布式系统中,对象可能位于不同的地址空间。远程代理可以隐藏对象所在的远程地址,并在本地提供一个代理对象,使得客户端感觉就像在访问一个本地对象。

虚拟代理:对于一些需要大量资源来创建的对象,可以使用虚拟代理来提供一个轻量级的替代品。只有当真正需要完整对象时,才会创建实际对象。

保护代理:代理模式还可以用于实现访问保护。通过代理对象,可以控制对实际对象的访问权限,确保只有符合条件的操作才能执行。

智能引用:在某些语言中,代理模式可以用于实现智能引用,比如引用计数、自动内存管理等。

代理模式通过引入一个代理层,提供了一种灵活的方式来增强和控制对象的行为,同时保持了系统的灵活性和可扩展性。在下一部分中,我们将详细介绍代理模式的组成部分和实现方式。

第二部分:代理模式的组成与实现

2.1 角色定义

主题(Subject)

  • 定义:定义了真实对象和代理对象的共同接口,这样代理可以代替真实对象被使用。
  • 角色:充当代理和真实对象的契约。

代理(Proxy)

  • 定义:代理对象内部含有对真实对象的引用,从而可以控制对真实对象的访问。
  • 角色:提供与真实对象相同的接口,并在访问真实对象前或访问后增加额外的处理。

客户端(Client)

  • 角色:通过代理对象来间接访问真实对象,客户端并不直接与真实对象交互。
  • 职责:客户端通过代理对象发送请求,由代理对象来决定如何将请求转发给真实对象。

2.2 Java实现示例

以下是使用Java语言实现代理模式的一个简单示例。我们将创建一个计算资源密集型的对象,并通过代理来控制对该对象的访问。

// 主题接口
interface Subject {void request();
}// 真实对象
class RealSubject implements Subject {@Overridepublic void request() {System.out.println("RealSubject: Handling request.");// 模拟资源密集型操作}
}// 代理类
class Proxy implements Subject {private RealSubject realSubject;public Proxy() {this.realSubject = null;}public void request() {if (realSubject == null) {System.out.println("Proxy: Initializing RealSubject...");realSubject = new RealSubject();}realSubject.request();}
}// 客户端代码
public class Client {public static void main(String[] args) {Subject subject = new Proxy();subject.request();}
}

在这个示例中,Subject是主题接口,RealSubject是实现了该接口的真实对象。Proxy类实现了与真实对象相同的接口,并在内部持有真实对象的引用。Proxyrequest方法首先检查真实对象是否已经初始化,如果没有,则进行初始化,然后调用真实对象的request方法。

代理模式的变体

  • 远程代理:为远程对象提供代理,隐藏对象的远程地址。
  • 虚拟代理:为开销大的对象提供代理,直到真正需要时才创建实际对象。
  • 保护代理:控制对敏感对象的访问,根据不同的访问权限提供不同的访问策略。
  • 智能引用代理:在访问对象时自动执行额外操作,如引用计数、缓存等。

代理模式通过引入代理层,为对象的访问提供了额外的控制和扩展点,使得可以在不修改对象本身的情况下增加额外的功能。在下一部分中,我们将探讨代理模式的使用场景。

第三部分:代理模式的使用场景

3.1 控制对象访问

在需要控制对复杂对象或远程对象访问时,代理模式非常有用。例如:

  • 访问控制:代理可以检查调用者是否有权限访问真实对象。
  • 远程访问:代理可以作为远程对象的本地代表,隐藏对象的远程地址和通信细节。
  • 延迟加载:代理可以延迟加载重量级的对象,直到它们真正需要时。

3.2 延迟初始化

在需要延迟对象初始化以提高性能或资源利用时,代理模式的优势包括:

  • 性能优化:通过延迟加载,可以减少系统的启动时间,提高响应速度。
  • 资源节约:只有在真正需要时才创建对象,可以节约内存和其他资源。
  • 按需初始化:代理可以根据实际需求来决定是否初始化对象,实现更灵活的控制。

代理模式通过引入代理层,为对象的访问提供了额外的控制和扩展点,使得可以在不修改对象本身的情况下增加额外的功能。在实际开发中,根据具体需求和场景选择是否使用代理模式是非常重要的。

第四部分:代理模式的优点与缺点

4.1 优点

提高安全性

  • 访问控制:代理模式可以对敏感对象的访问进行控制,确保只有符合条件的操作才能执行。

减少资源消耗

  • 延迟初始化:代理模式允许延迟对象的初始化,从而减少不必要的资源消耗。

提升性能

  • 远程代理:通过远程代理,可以在需要时才加载远程对象,从而提高性能。

增加灵活性

  • 动态代理:代理可以在运行时动态地生成,为对象的访问提供灵活的控制。

简化远程通信

  • 远程代理:远程代理可以隐藏对象的远程地址,简化客户端与远程对象的通信。

易于维护

  • 分离关注点:代理模式将访问控制和业务逻辑分离,使得维护和扩展变得更加容易。

4.2 缺点

增加系统复杂性

  • 代理类:为每个需要代理的对象创建代理类可能会增加系统的复杂性。

可能影响性能

  • 额外的间接层:代理模式引入了额外的间接层,可能会对性能产生一定影响。

代理对象的同步问题

  • 多线程环境:在多线程环境中,需要特别注意代理对象的同步问题。

第五部分:代理模式与其他模式的比较

5.1 与装饰者模式的比较

装饰者模式

  • 目的:动态地给对象添加额外的职责。
  • 实现:通过组合来包装对象,增加新的行为。

代理模式

  • 目的:控制对对象的访问。
  • 实现:通过代理对象来间接访问真实对象。

对比

  • 职责:装饰者模式主要用于扩展功能,而代理模式主要用于控制访问。
  • 使用场景:装饰者模式适用于需要动态添加职责的场景,代理模式适用于需要控制对象访问的场景。

5.2 与适配器模式的对比

适配器模式

  • 目的:使不兼容的接口能够一起工作。
  • 实现:通过继承或组合来转换一个类的接口。

代理模式

  • 目的:控制对对象的访问。

对比

  • 接口转换:适配器模式主要用于接口转换,而代理模式主要用于控制对象的访问。
  • 使用场景:适配器模式适用于解决接口不兼容的问题,代理模式适用于需要控制对象访问的场景。

代理模式通过引入代理层,为对象的访问提供了额外的控制和扩展点,使得可以在不修改对象本身的情况下增加额外的功能。在实际应用中,根据具体需求和场景选择合适的设计模式是非常重要的。在下一部分中,我们将提供代理模式的最佳实践和建议。

第六部分:代理模式的最佳实践和建议

6.1 最佳实践

保持代理的透明性

  • 透明代理:代理对象应该尽可能对客户端透明,即客户端与代理对象交互的方式与真实对象相同。

代理的职责单一

  • 单一职责原则:每个代理应该只有一个职责,避免将多个职责混合在一个代理中。

延迟初始化

  • 按需创建:代理应该在第一次请求时才初始化真实对象,以节省资源并提高效率。

考虑线程安全

  • 多线程环境:在多线程环境中使用代理模式时,确保代理对象是线程安全的。

使用代理工厂

  • 工厂模式:通过工厂模式来创建和管理代理对象,可以更好地控制对象的创建和生命周期。

代理的可替换性

  • 可替换性:设计代理时,应确保代理对象可以被其他代理或真实对象替换,以提高系统的灵活性。

6.2 避免滥用

避免过度封装

  • 封装适度:避免过度封装,过度封装可能会隐藏过多的实现细节,使得系统难以理解和维护。

避免代理的复杂性

  • 简单代理:保持代理逻辑的简单性,避免在代理中引入复杂的逻辑。

避免滥用延迟初始化

  • 合理使用延迟初始化:虽然延迟初始化可以节省资源,但过度使用可能会导致系统在关键时刻响应缓慢。

避免代理的滥用

  • 必要性:只在真正需要控制访问或延迟初始化时使用代理模式,避免在不需要时引入不必要的复杂性。

6.3 替代方案

使用依赖注入

  • 依赖注入:通过依赖注入来管理对象的生命周期和依赖关系,而不是使用代理模式。

使用观察者模式

  • 观察者模式:在需要监控对象状态变化时,可以使用观察者模式来代替代理模式。

使用组合模式

  • 组合模式:在需要表示对象的部分-整体层次结构时,可以使用组合模式来代替代理模式。

使用策略模式

  • 策略模式:在需要根据不同的策略动态改变对象行为时,可以使用策略模式来代替代理模式。

使用外观模式

  • 外观模式:在需要简化客户端对复杂系统的访问时,可以使用外观模式来代替代理模式。

代理模式是一种强大的设计模式,可以提供访问控制、延迟初始化等功能。然而,合理使用代理模式并避免滥用是至关重要的。了解其替代方案可以帮助开发者根据具体需求和场景选择最合适的设计模式。在实际开发中,应根据具体情况灵活运用代理模式,以达到最佳的设计效果。

结语

代理模式提供了一种灵活的方式来控制对对象的访问,同时允许在不修改对象自身的情况下添加额外的职责。通过本文的深入分析,希望读者能够对代理模式有更全面的理解,并在实际开发中做出合理的设计选择。

 相关Java设计模式文章推荐:

Java二十三种设计模式-单例模式(1/23)

Java二十三种设计模式-工厂方法模式(2/23)

Java二十三种设计模式-抽象工厂模式(3/23)

Java二十三种设计模式-建造者模式(4/23)

Java二十三种设计模式-原型模式(5/23)

Java二十三种设计模式-适配器模式(6/23)

Java二十三种设计模式-装饰器模式(7/23) 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于 HTML+ECharts 实现智慧运维数据可视化大屏(含源码)

智慧运维数据可视化大屏:基于 HTML 和 ECharts 的实现 在现代企业中,运维管理是确保系统稳定运行的关键环节。随着数据量的激增,如何高效地监控和分析运维数据成为了一个重要课题。本文将介绍如何利用 HTML 和 ECharts 实现一个智慧运维数据可…

14、如何⽤DDD设计微服务代码模型

在完成领域模型设计后,接下来我们就可以开始微服务的设计和 落地了。在微服务落地前,⾸先要确定微服务的代码结构,也就是我 下⾯要讲的微服务代码模型。 只有建⽴了标准的微服务代码模型和代码规范后,我们才可以将 领域对象映射到…

【Rust】所有权OwnerShip

什么是所有权 rust使用由编译器检查的一些规则构成的所有权系统来管理内存。且这不会影响程序的运行效率。 所有权规则 rust中每一个每一个值都有一个owner。在同一时刻,只能有一个owner。当这个owner超过范围,则该值会被丢弃。 String类型 为什么需…

全链路追踪 性能监控,GO 应用可观测全面升级

作者:古琦 01 介绍 随着 Kubernetes 和容器化技术的普及,Go 语言不仅在云原生基础组件领域广泛应用,也在各类业务场景中占据了重要地位。如今,越来越多的新兴业务选择 Golang 作为首选编程语言。得益于丰富的 RPC 框架&#xff…

虚拟机centos9搭建wordpress

目录 1. 更换yum源更新系统软件包: 1.1备份yum源 1.1.1创建备份目录: 1.1.2移动现有仓库配置文件到备份目录: 1.1.3验证备份: 1.2更换yum源 1.2.1添加yum源 1.2.2删除和建立yum缓存 1.3更新系统软件包 1.4 yum与dnf介绍…

单元测试的最佳实践

整体架构 合适的架构可以提升可测试性。比如菱形对称架构的模块化和解耦特性使得系统各个部分可以独立进行单元测试。这不仅提高了测试的效率,还能够减少测试的依赖性,提高测试准确性。 代码设计 代码设计和可测试性有密切关联。强烈建议一个方法的代码行…

Docker 安全及日志管理(包含SSL证书)

目录 一、Docker 存在的安全问题 二、Docker 架构缺陷与安全机制 三、Docker 安全基线标准 四、容器相关的常用安全配置方法 五、限制流量流向 六、镜像安全 七、DockerClient 端与 DockerDaemon 的通信安全 https的单向认证流程 https的双向认证流程 八、DockerClie…

Qt 使用视口和窗口作图

物理坐标系与逻辑坐标系 绘图设备的物理坐标系是基本的坐标系,通过 QPainter 的平移、旋转等坐标变换可以得到更容 易操作的逻辑坐标系。 物理坐标系也称为视口(viewport)坐标系,逻辑坐标系也称为窗口( window&…

USB转多路串口-纯硬件实现串口数据传输指示灯电路

前言 串口相关产品往往要求有数据收发时LED闪烁,我们经常会用软件实现,在MCU内注册一个定时器,有数据发送时就闪烁一段时间。软件点灯这种方式存在两个缺陷,一是接收方向不好实现;二是定时器一般用固定频率&#xff0…

谷粒商城实战笔记-63-商品服务-API-品牌管理-OSS获取服务端签名

文章目录 一,创建第三方服务模块thrid-party1,创建一个名为gulimall-third-party的模块2,nacos上创建third-party命名空间,用来管理这个服务的所有配置3,配置pom文件4,配置文件5,单元测试6&…

Selenium 的使用

selenium 是一个自动化测试工具,利用它可以驱动浏览器完成特定的操作,例如点击,下拉等,还可以获取浏览器当前呈现的页面的源代码,做到所见即所爬,对于一些 JavaScript 动态渲染的界面来说,这种爬…

封装和桥接Unity 协程体系

简介 协程(Coroutine)在C#中是一种特殊的函数,它允许开发者编写可以暂停执行并在未来某个时刻恢复执行的代码块。协程通常用于实现异步操作,如延时执行、等待某个事件发生、或者分段执行复杂的任务。在Unity游戏引擎中&#xff0c…

算法之递归算法

递归是非常常见的一种算法, 也比较难以理解,简而言之,递归就是写了一个方法,方法中还调用了该方法,相当于自己调用自己,如果书写不当,就会有堆栈溢出的风险,无法跳出。 所以我们编写…

内网对抗-隧道技术篇防火墙组策略HTTP反向SSH转发出网穿透CrossC2解决方案

知识点: 1、C2/C2上线-CrossC2插件-多系统平台支持 2、隧道技术篇-应用层-SSH协议-判断&封装&建立&穿透 3、隧道技术篇-应用层-HTTP协议-判断&封装&建立&穿透隧道技术主要解决网络通讯问题:遇到防火墙就用隧道技术,…

深入分析 Android ContentProvider (五)

文章目录 深入分析 Android ContentProvider (五)ContentProvider 的性能优化和实践案例1. 性能优化技巧1.1. 数据库索引优化示例:添加索引 1.2. 批量操作与事务管理示例:批量插入操作 1.3. 使用异步操作示例:使用 AsyncTask 进行异步查询 1.…

手持式气象检测设备:便携科技,气象探测

一、手持式气象检测设备:小巧身躯,大能量 手持式气象检测设备,顾名思义,是一种可以手持操作的气象监测工具。它集成了温度、湿度、气压、风速风向等多种传感器,能够实时获取气象数据,并通过显示屏或手机APP…

如何快速抓取小红书帖子评论?两大实战Python技巧揭秘

摘要: 本文将深入探讨两种高效的Python方法,助您迅速获取小红书文章下方的所有评论,提升市场分析与用户洞察力。通过实战示例与详细解析,让您轻松掌握数据抓取技巧,为您的内容营销策略提供有力支持。 如何快速抓取小…

上传项目到GitHub

上传项目到GitHub 前期工作:创建GitHub仓库 1.使用git命令初始化文件夹 git init2.将文件夹里面所有的文件添加到本地仓库,如果想添加单个文件,将.换成文件名就好。 git add .3.给文件备注,双引号里面是文件备注的内容 git c…

监控系列(八)部署dameng_exporter并对接prometheus

一、下载dameng_exporter采集器 官网地址:https://github.com/gaoyuan98/dameng_exporter DM数据库适配prometheus监控的采集器,目前已支持DM8数据库同时提供grafana 8.5.X 以上版本的监控面板(其他的grafana版本需要自己绘制表盘&#xff…

Nginx 如何处理 WebSocket 连接?

🍅关注博主🎗️ 带你畅游技术世界,不错过每一次成长机会! 文章目录 Nginx 如何处理 WebSocket 连接?一、WebSocket 连接简介二、Nginx 处理 WebSocket 连接的基本原理三、配置 Nginx 支持 WebSocket 连接四、Nginx 中的…