结构型-代理模式(Proxy Pattern)

什么是代理模式

由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。

Java中的代理按照代理类生成时机不同又分为静态代理和动态代理。静态代理代理类在编译期就生成,而动态代理代理类则是在Java运行时动态生成。动态代理分为JDK代理和CGLib代理两种。

结构

  • 抽象主题(Subject)类: 通过接口或抽象类声明真实主题和代理对象实还会现的业务方法。
  • 真实主题(Real Subject)类: 实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象。
  • 代理(Proxy)类 : 提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问、控制或扩展真实主题的功能。

UML类图

代码理解

public interface Subject {
    void operation();
}

public class RealSubject implements Subject {
    @Override
    public void operation() {
        System.out.println("RealSubject: Handling request.");
    }
}

public class Proxy implements Subject {
    private RealSubject realSubject;

    @Override
    public void operation() {
        if (realSubject == null) {
            realSubject = new RealSubject();
        }
        System.out.println("Proxy: Logging the time before executing operation.");
        realSubject.operation();
        System.out.println("Proxy: Logging the time after executing operation.");
    }
}

public class Client {
    private Subject proxy;

    public void useProxy() {
        proxy = new Proxy(); // 使用代理对象
        proxy.operation();  // 通过代理对象调用操作
    }
}

优缺点

优点:

  • 代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用;
  • 可以在不修改实际对象代码的情况下,通过引入代理对象来扩展功能;
  • 代理模式能将客户端与目标对象分离,在一定程度上降低了系统的耦合度;
  • 代理模式可以在实际需要时才创建实际对象,从而节省资源,特别是在创建对象成本较高的情况下。

缺点:

  • 增加了系统的复杂度;
  • 代理模式增加了一层间接性,可能会导致性能开销,尤其是在代理操作非常频繁的情况下。
  • 如果代理模式被滥用,可能会导致系统中存在过多的代理对象,使得系统难以理解和维护。

使用场景

  1. 远程代理(Remote Proxy)
    • 用于隐藏对象位于不同地址空间的事实,使得客户端代码可以像访问本地对象一样访问远程对象。
    • 例如,远程服务器上的一个对象,客户端通过远程代理与之交互,无需关心网络通信的细节。
  1. 虚拟代理(Virtual Proxy)
    • 用于延迟创建开销大的对象,直到真正需要时才创建。
    • 例如,加载大型图像或文档时,可以先使用一个轻量级的代理对象,直到需要显示图像或文档内容时才加载实际的资源。
  1. 保护代理(Protection Proxy)
    • 控制对原始对象的访问,提供权限检查。
    • 例如,访问受保护的资源时,代理可以检查用户权限,确保只有授权用户才能访问。
  1. 智能引用代理(Smart Reference Proxy)
    • 在访问对象时执行额外的动作,如引用计数、加载持久对象等。
    • 例如,管理数据库连接池,智能引用代理可以跟踪连接的使用情况,并在适当的时候释放连接。
  1. 局部代理(Local Proxy)
    • 在代码中提供一个本地代表,用于访问另一个系统或组件。
    • 例如,在Web服务中,客户端代码可能通过一个局部代理与服务端通信,而无需直接处理HTTP请求和响应。
  1. 日志代理(Logging Proxy)
    • 在调用实际对象的方法前后添加日志记录。
    • 例如,为了监控系统性能或调试目的,代理可以在方法调用前后记录日志。
  1. 同步化代理(Synchronization Proxy)
    • 控制对多线程环境中共享资源的访问,确保线程安全。
    • 例如,代理可以管理对共享数据结构的并发访问,确保在任何时候只有一个线程可以修改数据。
  1. 防火墙代理(Firewall Proxy)
    • 提供安全控制,防止外部系统直接访问内部系统。
    • 例如,限制外部网络访问内部网络资源,只允许通过代理进行特定的操作。
  1. 延迟初始化代理(Lazy Initialization Proxy)
    • 用于实现懒加载模式,即只有在需要时才初始化对象。
    • 例如,初始化一个复杂的系统组件,直到实际需要使用该组件时才进行初始化。
  1. 缓存代理(Cache Proxy)
    • 缓存对象的结果以避免重复计算或重复访问数据库。
    • 例如,代理可以存储数据库查询的结果,并在后续请求中提供这些缓存结果。

动态代理与静态代理比较

静态代理

  • 代理生成时机:在编译时生成代理类。
  • 代理类创建方式:需要手动创建代理类。
  • 目标类要求:目标类必须实现接口。
  • 代码复用性:代码重复较多,每增加一个代理就需要编写一个新的代理类。
  • 灵活性:不灵活,代理类与目标类耦合。
  • 性能:性能略好,涉及到静态方法调用。
  • 适用场景:适用于接口较少且不经常变动的场景,例如日志记录、安全控制等。

动态代理

  • 代理生成时机:在运行时动态生成代理类。
  • 代理类创建方式:自动通过反射(JDK)或字节码生成(CGLIB)。
  • 目标类要求:JDK 动态代理要求目标类实现接口,CGLIB 无需接口。
  • 代码复用性:代码复用性较高,可以动态地为不同的类创建代理。
  • 灵活性:灵活,代理类和目标类解耦,可以在运行时创建代理。
  • 性能:性能较好,尤其在 CGLIB 中,直接操作字节码,但因为使用了反射机制,性能较差。
  • 适用场景:适用于接口较多且经常变动的场景,例如AOP编程、远程调用等。

JDK 动态代理与 CGLIB 动态代理比较

  • 基于:JDK 动态代理基于接口实现的代理,只能代理实现了接口的类;CGlib方式是基于继承实现的代理,可以作为JDK代理方式的补充方案。
  • 目标类要求:JDK 动态代理的目标类必须实现接口;CGLIB 动态代理的目标类不需要实现接口,直接代理类。
  • 使用方式:JDK 动态代理使用 Proxy.newProxyInstance;CGLIB 使用 Enhancer 类来创建代理类。
  • 性能:JDK 动态代理因为使用了反射机制,性能较差;CGLIB 通过字节码生成子类,性能较好。
  • 是否支持 final :JDK 动态代理支持,接口类不需要是 final;CGLIB 不支持,目标类不能是 final 类。
  • 生成的代理类:JDK 动态代理动态生成的代理类实现了目标接口;CGLIB 动态生成的代理类是目标类的子类。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何实现多级缓存以及缓存之间数据的一致性

文章目录 神领物流 -- 如何实现多级缓存以及缓存之间数据的一致性一. 为什么要使用多级缓存?二. 为什么要选择MongoDB作为数据库三. 如何缓存之间的一致性1. 如何同步更新Redis缓存2. 如何同步更新CaffeineCache缓存 神领物流 – 如何实现多级缓存以及缓存之间数据的一致性 采…

哈希处理海量数据

接下来我们将以问题的形式来介绍如何用hash处理海量数据。 1.问题1 (位图) 给定100亿个整数,设计算法找到只出现一次的。 1.1问题分析 100亿个整数,一个整数占用4byte,那么就需要约40G左右的空间来存储。显然常见的…

锐捷Web认证

文章目录 Web认证二代 Web 认证配置 🏡作者主页:点击! 🤖Datacom专栏:点击! ⏰️创作时间:2024年12月6日11点40分 Web认证 Portal 认证、Web认证 Web认证的介绍 Web 认证使用浏览器进行身份验…

深入剖析 Profinet 转 EtherCAT 网关模块的配置流程

有一个工厂需要将西门子S7-1200 PLC与伺服驱动进行通讯,因PLC支持PROFINET而伺服驱动需EtherCAT协议,无法直接通讯。采用捷米特(JM-ECTM-PN)智能的Profinet转EtherCAT网关模块解决此问题,需导入GSD文件、设定IP和设备名…

【C++习题】17.栈的弹出压入序列

题目&#xff1a; 链接&#x1f517;&#xff1a;栈的弹出压入序列 题目&#xff1a; 代码&#xff1a; class Solution { public:bool IsPopOrder(vector<int> pushV,vector<int> popV) {//入栈和出栈的元素个数必须相同if(pushV.size() ! popV.size())return …

【计算机网络】VLAN及IPVLAN技术解析

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了学习VLAN相关知识的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于 使用VMware组建VLAN网络实验环境 进行的&#xff0c;每个…

【Java】—— 继承

1.继承 1.1 为什么需要继承 在使用类的时候&#xff0c;是将生活中的实物&#xff0c;抽象到代码中进行表示&#xff0c;在生活中&#xff0c;很多实物都是存在关联的&#xff0c;例如 哈士奇、中华田园犬、萨摩耶 都是狗&#xff0c;他们有共性信息&#xff0c;也有属于自己…

2024-12-06 Unity Addressables3——资源加载

文章目录 1 引用加载1.1 Addressables 的资源引用类1.2 加载资源1.3 加载场景1.4 释放资源 2 Label 介绍3 动态加载3.1 加载单个资源3.2 加载多个资源 Unity 版本&#xff1a;6000.0.26f1c1Addressables 版本&#xff1a;2.3.1 1 引用加载 1.1 Addressables 的资源引用类 Ass…

【WRF理论第十三期】详细介绍 Registry 的作用、结构和内容

目录 1. Introduction&#xff1a;介绍 Registry 的作用和功能。2. Registry Contents&#xff1a;详细描述 Registry 的结构和内容&#xff0c;包括各个部分的条目类型。2.1. DIMSPEC ENTRIES&#xff08;维度规格条目&#xff09;2.2. STATE ENTRIES&#xff08;状态变量条目…

在阿里云/Linux环境搭建Gitblit服务

在阿里云/Linux环境搭建Gitblit服务 1. 整体描述2. 前期准备3. 安装步骤3.1 下载gitblit3.2 上传gitblit3.3 解压文件3.4 修改文件配置3.5 启动gitblit3.6 安全组配置 4. 总结 1. 整体描述 前段时间买了一个阿里云服务器&#xff0c;2核2G&#xff0c;3M固定带宽的配置&#x…

鸿蒙arkts怎么打印一个方法的调用堆栈

做鸿蒙开发的时候&#xff0c;也想看一下一个方法到底是哪里调用的&#xff0c;工程太大&#xff0c;断点太麻烦&#xff0c;可以加堆栈日志。 在你的方法中加上这两句&#xff0c;就可以跟到堆栈日志 let err new Error() console.log(>>>>>>err.stack) …

116. UE5 GAS RPG 实现击杀掉落战利品功能

这一篇&#xff0c;我们实现敌人被击败后&#xff0c;掉落战利品的功能。首先&#xff0c;我们将创建一个新的结构体&#xff0c;用于定义掉落体的内容&#xff0c;方便我们设置掉落物。然后&#xff0c;我们实现敌人死亡时的掉落函数&#xff0c;并在蓝图里实现对应的逻辑&…

亚马逊云服务器Amazon EC2

一、什么是Amazon EC2&#xff1f; Amazon Elastic Compute Cloud (Amazon EC2) 在 Amazon Web Services (AWS) 云中提供按需、可扩展的计算容量。使用 Amazon EC2 可降低硬件成本&#xff0c;让您能够更快地开发和部署应用程序。您可以使用 Amazon EC2 启动任意数量的虚拟服务…

Word 右键内容不显示段落/字体问题解决

有时需要调整图片的行间距&#xff0c;但是右键图片所在行&#xff0c;没有段落的选项。 可以将焦点保持在图片所在行&#xff0c;然后点击右下角的图标。同理不显示字体也可以点击左边字体中的右下角图标。

学生公寓智能限电系统的功能和作用

学生公寓智能限电系统‌是一种用于管理和限制学生公寓用电的设备和技术&#xff0c;旨在确保用电安全、防止火灾事故&#xff0c;并促进节能减排。以下是关于学生公寓智能限电系统的详细介绍&#xff1a; 1、功能和作用 智能限电系统通过以下功能来管理和限制用电&#xff1a…

[IT项管理(双语)]项目的基本概念

什么是项目 1.1项目的定义 项目&#xff08;project&#xff09;是为了创造一个特定的产品&#xff0c;服务&#xff0c;或者成果而采用的临时性的努力。 项目 产出唯一 临时性 1.2运营的定义 运营&#xff08;operation&#xff09;是 为了维持业务而进行的工作。 Imp1.3运…

ASP.NET Core SignalR 双工通信

01. 介绍 &#x1f3af; ASP.NET Core SignalR 是一个开放源代码库&#xff0c;它简化了向应用添加实时 Web 功能的过程。 实时 Web 功能使服务器端代码可以在服务器上激发事件时将事件推送到连接的客户端。 使用 SignalR&#xff0c;客户端也可以将消息发送到服务器&#xff…

Sonar基于SonarQube统一产品命名,助力提升开发者体验,以及本地、云端或IDE端的代码质量与安全

日前&#xff0c;领先的代码质量和安全解决方案提供商Sonar宣布&#xff0c;将围绕SonarQube简化其现有的产品命名。 作为Sonar的旗舰品牌&#xff0c;SonarQube代表了公司的核心使命&#xff1a;提高所有代码的质量和安全性&#xff0c;同时提供更好的开发人员体验。这些变化…

搭建高可用负载均衡系统:Nginx 与云服务的最佳实践

搭建高可用负载均衡系统&#xff1a;Nginx 与云服务的最佳实践 引言 在项目开发过程中&#xff0c;我们通常在开发和测试阶段采用单机架构进行开发和测试。这是因为在这个阶段&#xff0c;系统的主要目的是功能实现和验证&#xff0c;单机架构足以满足开发人员的日常需求&…

芯科科技突破性超低功耗Wi-Fi 6和低功耗蓝牙5.4模块加速设备部署

致力于以安全、智能无线连接技术&#xff0c;建立更互联世界的全球领导厂商Silicon Labs&#xff08;亦称“芯科科技”&#xff0c;今日宣布推出SiWx917Y超低功耗Wi-Fi 6和低功耗蓝牙&#xff08;Bluetooth LE&#xff09;5.4模块。 作为成功的第二代无线开发平台的新产品&…