Java设计模式 十三 代理模式 (Proxy Pattern)

【图文详解系列】设计模式之代理模式(Proxy Pattern) 什么是代理模式?代理模式的定义:代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。通俗的来讲代理模式就是我们生活中常见的中介。代理模式的UML图:从UML图中,可以看... 阅读详情

代理模式 (Proxy Pattern)

代理模式是一种结构型设计模式,它为其他对象提供一种代理(或占位符)以控制对该对象的访问。通过代理模式,我们可以在不修改目标对象的情况下,控制对其的访问,添加额外的功能,比如懒加载、权限检查、日志记录等。

代理模式主要通过为目标对象创建一个代理对象来代替真实对象,代理对象可以控制对目标对象的访问,并可以在访问时提供附加功能。


1. 代理模式的组成

代理模式通常包括以下角色:

  • Subject(主题角色): 定义了真实对象和代理对象的公共接口。真实对象和代理对象都需要实现这个接口。
  • RealSubject(真实主题角色): 真实对象,定义了实际的业务操作逻辑。客户端可以通过代理对象来访问真实主题。
  • Proxy(代理角色): 代理对象,控制对真实对象的访问。代理对象可能会执行一些额外的操作(如权限检查、日志记录等),然后再委托给真实对象处理。
  • Client(客户端): 客户端通过代理对象来访问目标对象,而不是直接访问真实对象。

2. 代理模式的优点

  1. 透明化访问: 客户端无需知道自己是在访问代理对象还是实际对象,代理对象通过与实际对象相同的接口来提供服务,提供了透明的访问方式。
  2. 增强功能: 通过代理对象,能够在不改变目标对象的情况下,给目标对象添加额外的功能(如延迟加载、缓存、权限控制等)。
  3. 延迟加载: 可以在代理对象中实现延迟加载,直到真正需要时才初始化目标对象。
  4. 控制访问: 可以在代理对象中控制对真实对象的访问,比如添加安全检查、日志记录等功能。

3. 代理模式的缺点

  1. 性能开销: 代理模式可能会引入一些额外的性能开销,特别是代理对象需要进行额外的逻辑处理时,可能会影响性能。
  2. 增加复杂性: 代理模式会增加系统的复杂性,因为它引入了代理对象并且需要协调代理和目标对象之间的关系。

4. 代理模式的实现

场景示例:银行账户的访问控制

假设我们有一个银行账户类,用户可以通过该类来进行资金的存取操作。为了安全起见,银行希望对这些操作进行日志记录和权限控制。因此,我们可以使用代理模式来实现:

  1. 客户端直接操作代理对象。
  2. 代理对象在执行操作前进行权限检查、日志记录等,然后调用真实的银行账户操作。

1) 定义主题接口

首先定义一个接口,表示银行账户的基本操作。

// 主题接口
public interface BankAccount {
    void deposit(double amount);
    void withdraw(double amount);
    double getBalance();
}

2) 实现真实对象

真实对象实现了 BankAccount 接口,并提供具体的业务操作。

// 真实对象
public class RealBankAccount implements BankAccount {
    private double balance;

    public RealBankAccount(double initialBalance) {
        this.balance = initialBalance;
    }

    @Override
    public void deposit(double amount) {
        balance += amount;
        System.out.println("Deposited " + amount + ", New balance: " + balance);
    }

    @Override
    public void withdraw(double amount) {
        if (amount <= balance) {
            balance -= amount;
            System.out.println("Withdrew " + amount + ", New balance: " + balance);
        } else {
            System.out.println("Insufficient funds!");
        }
    }

    @Override
    public double getBalance() {
        return balance;
    }
}

3) 实现代理对象

代理对象实现了 BankAccount 接口,并在方法调用时添加额外的功能(如权限控制和日志记录)。

// 代理对象
public class BankAccountProxy implements BankAccount {
    private RealBankAccount realBankAccount;

    public BankAccountProxy(double initialBalance) {
        realBankAccount = new RealBankAccount(initialBalance);
    }

    @Override
    public void deposit(double amount) {
        logAction("deposit", amount);
        realBankAccount.deposit(amount);
    }

    @Override
    public void withdraw(double amount) {
        logAction("withdraw", amount);
        realBankAccount.withdraw(amount);
    }

    @Override
    public double getBalance() {
        return realBankAccount.getBalance();
    }

    private void logAction(String action, double amount) {
        System.out.println("Logging: Action = " + action + ", Amount = " + amount);
    }
}

4) 客户端代码

客户端通过代理对象来进行存款和取款操作,而不需要直接与真实对象交互。

public class Client {
    public static void main(String[] args) {
        BankAccount account = new BankAccountProxy(1000);

        // 客户端通过代理对象进行操作
        account.deposit(500);
        account.withdraw(200);
        account.withdraw(1000);
        System.out.println("Final balance: " + account.getBalance());
    }
}

运行结果:
Logging: Action = deposit, Amount = 500.0
Deposited 500.0, New balance: 1500.0
Logging: Action = withdraw, Amount = 200.0
Withdrew 200.0, New balance: 1300.0
Logging: Action = withdraw, Amount = 1000.0
Withdrew 1000.0, New balance: 300.0
Final balance: 300.0

在这个例子中,代理对象 BankAccountProxy 在调用真实银行账户的操作之前进行了日志记录,增加了访问控制的功能,而客户端并不需要知道这些细节。


5. 代理模式的应用场景

  1. 远程代理: 当一个对象位于不同的地址空间时,使用代理对象来控制对远程对象的访问(例如,远程方法调用(RMI))。
  2. 虚拟代理: 延迟加载资源或对象,直到真正需要时才创建。例如,图像的加载和显示通常使用虚拟代理模式来避免不必要的资源加载。
  3. 保护代理: 控制对真实对象的访问权限,比如验证用户的身份或权限。
  4. 智能代理: 代理对象可以添加一些额外的功能,比如引用计数、缓存、内存管理等。
  5. 缓存代理: 在代理中实现缓存功能,减少真实对象的重复访问。

6. 代理模式与其他模式的比较

设计模式主要用途与代理模式的区别
装饰模式动态地给对象添加额外的功能。装饰模式通常是给对象添加行为,而代理模式是控制对对象的访问。
适配器模式将接口转化为客户端期望的接口,使得两个不兼容的接口可以协同工作。适配器模式用于接口适配,而代理模式用于控制访问。
单例模式确保类只有一个实例并提供全局访问点。单例模式通常是限制实例数量,而代理模式是控制对对象的访问。

7. 总结

代理模式是一种非常实用的设计模式,它通过引入代理对象来控制对真实对象的访问,从而为客户端提供附加的功能,比如权限控制、延迟加载、日志记录等。代理模式可以透明地为客户端提供真实对象的功能,同时避免客户端直接依赖目标对象,从而使得系统更具灵活性和可扩展性。

在实际应用中,代理模式可以应用于许多场景,如远程代理、虚拟代理、保护代理和智能代理等。通过使用代理模式,能够在不改变目标对象的情况下,为目标对象添加额外的功能,同时有效地控制对象的访问。

代理模式(Proxy Pattern) 代理模式是一种结构型设计模式,它允许你提供一个代理对象来控制对另一个对象(称为"被代理对象"或"目标对象")的访问。代理对象充当了客户端和目标对象之间的中介,拦截对目标对象的所有调用。封装性:客户端与目标对象之间的中间层可以起到保护目标对象的作用扩展性:符合开闭原则,可以在不修改目标对象的前提下扩展目标对象的功能灵活性:可以通过代理控制对目标对象的访问,并增加额外的业务逻辑解耦性:可以将与目标对象无关的功能抽离出来,保持目标对象的纯粹性。 阅读详情

相关推荐

浮点数运算的陷阱与启示:FP16加法器/乘法器开发中的常见误区

本文深入探讨FP16加法器和乘法器开发中的常见误区,包括FP16格式解析、阶码对齐陷阱、尾数运算风险及规格化处理。通过Verilog实战代码展示防御性编程技巧,帮助开发者避免边界条件处理和异常状态管理中的错误,提升硬件设计的可靠性和效率。

dell8的博客 250

代理模式的优缺点

使用代理模式具有以下几个优点: 1、代理模式能将代理对象与真实被调用的目标对象分离。 2、一定程度上降低了系统的耦合度,扩展性好。 3、可以起到保护目标对象的作用。 4、可以对目标对象的功能增强。 当然,代理模式也是有缺点的: 1、代理模式会造成系统设计中类的数量增加。 2、在客户端和目标对象增加一个代理对象,会造成请求处理速度变慢。 3、增加了系统的复杂度。 ...

Leon_Jinhai_Sun的博客 1万+

Dify DSL文件分享 Dify讨论群 大模型token资源等(持续收集更新)

基于LLMOps平台-Dify的一站式学习平台。包含不限于:Dify案例、DSL文件分享、模型接入、Dify交流讨论等各类资源分享。

同名公众号:dify实验室 3716

Java 代理模式怎么实现,有什么优缺点

代理模式是一种常见的设计模式,它可以为其他对象提供一种代理以控制对这个对象的访问。代理对象具有与被代理对象相同的接口,客户端无需知道代理对象和被代理对象的区别。代理模式可以应用于各种不同的场景,例如远程代理、虚拟代理、保护代理等。本文将介绍 Java 中代理模式的实现方式和优缺点,并提供相应的代码示例。

徐师兄的博客 260

英飞凌 AURIX Development Studio工程移植到Hightec的方法

1. 软件简介 AURIX™ Development Studio是英飞凌针对AURIX TC2XX/TC3XX系列单片机推出了一款免费的软件,集成了iLLD库,内置Tasking compiler和Tasking Debugger,但这两个模块只能用于非商业用途,可供学习和试用。iLLD库是英飞凌为TC2XX和TC3XX Tricore系列单片机提供的底层驱动库,有完善的使用手册,和较好的移植性。 Hightec是一款可以用来开发Aurix系列单片机的编译器,有免费版,可商用,集成GCC编译器,可用UDE

weixin_42967006的博客 7137

AWS SQS跨账户访问失败排查指南

在使用AWS SQS(Simple Queue Service)时,跨账户访问是常见的业务场景。例如,账户A的应用程序向队列发送消息,账户B的消费者从队列拉取消息。尽管AWS官方文档明确支持此类配置,但在实际应用中,由于权限模型的复杂性,开发者和运维人员常会遇到“策略已配置但无法接收消息”的问题。通过本文的逐步排查指南,您不仅可以解决当前问题,还能深入理解AWS跨账户访问的权限模型。接收方账户的用户或角色必须同时附加IAM策略,显式授权操作目标队列。尽管策略看似允许接收方操作,实际测试中却返回空消息或。

探索云原生与智能化驱动下的安全运维新范式。关注DevSecOps、可观测性、AIOps等前沿领域,与您共赴技术前沿。 458

设计模式-结构型模式-代理模式

让你能够提供对象的代替品或占位符,代理控制着对于原对象的访问,并允许将请求提交给对象前后进行一些处理;

LB_bei的博客 1425

流体仿真软件:COMSOL Multiphysics二次开发_(11).COMSOL与外部软件的数据交换

通过上述方法,您可以实现 COMSOL Multiphysics 与外部软件的数据交换,从而更好地集成和分析仿真结果。无论是从文本文件导入数据,导出数据到 MATLAB,还是通过 API 和 COMSOL Server 实现实时通信,都能满足不同场景下的需求。希望这些内容对您在流体仿真领域的开发工作有所帮助。

kkchenjj的博客 1553

java设计模式之代理模式

代理模式是设计模式的一种

m0_69786753的博客 640

基于 YOLOv26 的校园安全监控系统:多场景应用

本文提出了一种基于YOLOv26的校园安全监控系统,采用多场景应用架构实现对校园安全的智能监测。系统核心技术包括YOLOv26目标检测、DeepSORT目标跟踪、区域安全定义和行为分析等模块,通过边缘计算平台实现实时处理。研究构建了包含多种校园场景的专业数据集,并采用数据增强技术提升模型性能。系统可检测人员、车辆和物品等目标,分析其行为轨迹,评估安全风险并触发告警。实验结果表明,该系统能有效识别校园安全隐患,为安全管理提供智能化解决方案。

一键难忘的博客 503

ARMv8/ARMv9的TLB深度学习

千万不要人云亦云。一个TLB entry里有很多很多东西的,有100多个比特位呢,并不是仅仅只有VA/PA/nG/VMID/ASID等。.👉👉👉 个人博客笔记导读目录(全部) 👈👈👈。

baron-周贺贺-代码改变世界ctw 1569

代理模式实现方式及优缺点对比

代理模式实现方式及优缺点对比 代理模式最典型的应用就是AOP,本文结合主要讲解了代理模式的几种实现方式:静态代理和动态代理,这里动态代理又可以分为jdk代理和Cglib代理,另外,本文也对这几种代理模式的优缺点进行了对比。 代理,顾名思义,即代替被请求者来处理相关事务。代理对象一般会全权代理被请求者的全部只能,客户访问代理对象就像在访问被请求者一样,虽然代理对象最终还是可能会访问被请求者,但是其可以在请求之前或者请求之后进行一些额外的工作,或者说客户的请求不合法,直接拒绝客户的请求。如下图所示为代理模式的一

weixin_43829047的博客 1887

【系统架构设计师】2025年下半年真题论文回忆版及写作要点

本文摘要围绕云原生数据库、性能测试、无服务器架构和秒杀场景等关键技术进行论述。云原生数据库通过容器化、微服务和自动化运维实现弹性扩展;性能测试需要规划测试场景并关注响应时间等关键指标;无服务器架构以事件驱动为核心,简化开发流程;秒杀场景需组合运用扩容、缓存、限流等技术应对高并发。这些技术方案为构建现代高可用系统提供了重要参考。

数据知道的博客 6157

JAVA 二十三种设计模式大全(十)代理模式(Proxy Pattern)(一)

文章目录概念介绍代码 概念 在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。 在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。 介绍 意图:为其他对象提供一种代理以控制对这个对象的访问。 主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象

自救 唯有自强 196

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

JAVA 二十三种设计模式大全(十一)代理模式(Proxy Pattern)(二)静态代理

文章目录设计图代码 设计图 其实主要还是多态的体现 代码 public interface Movable { void move(); } public class LogProxy implements Movable{ private Logger logger = LoggerFactory.getLogger("LogProxy"); private Movable m; public LogProxy(Movable m){ this.m =

自救 唯有自强 166

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

JAVA 二十三种设计模式大全(十二)代理模式(Proxy Pattern)(三)动态代理

文章目录改进(需求)代码 改进(需求) 我们的静态代理,只能代理一个固定的接口。 比如在(二)中,我们写了4个类去实现Movable接口,也就是4个类代理一个类。 那我如果现在多写一个Eatable接口,那我又需要再写4个类去代理它(假如要实现的功能与上面类似时)。 那这样似乎又是在重复堆砌了,能否有一种把所要代理的接口写活的方法呢? 让我们只需要写一次代理类,处处使用? 代码 注:带$符号的都是代理类 ...

自救 唯有自强 539

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

23种设计模式之代理模式(Proxy Pattern)

本篇文章将23种设计模式中的代理模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。

小威的博客 2万+

【设计模式】Java 设计模式之代理模式(Proxy Pattern)

然而,随着技术的不断发展和业务需求的不断变化,我们也需要对代理模式进行扩展和思考,以适应新的挑战和需求。未来,我们可以继续探索代理模式与其他技术的结合,以及如何更好地优化代理模式的性能,为构建高质量的软件系统提供有力支持。总结来说,代理模式是一种强大的设计模式,它可以在不修改原有代码的基础上增强对象的功能、控制对象的访问以及实现解耦。在某种意义上,代理模式也可以看作是一种特殊的装饰器模式,它主要关注于控制对对象的访问和增强对象的功能,而不是动态地添加职责。:主要用于控制对开销大的对象的访问。

新手村长的专栏 1745

设计模式-代理模式-Proxy Pattern

首先定义一个接口,这个接口包含所有代理类和实际对象需要实现的方法。

wesigj的博客 1627

设计模式|代理模式(Proxy Pattern)

代理模式(Proxy Pattern)是一种结构型设计模式,它允许你提供一个间接访问对象的方式,以控制对对象的访问。这种模式通常在不改变原始类代码的情况下,添加一些额外的逻辑或控制。

weixin_44435110的博客 1162

23种设计模式——代理模式(Proxy Pattern)详解

本文介绍了23种设计模式里面超好用的模式——代理模式(Proxy Pattern)!!!

Meteors.的博客 1625

JAVA设计模式之 代理模式【Proxy Pattern】

一、概述     给某一个对象提供一个代理,并由代理对象来完成对原对象的访问。代理模式是一种对象结构型模式。 二、适用场景     当无法直接访问某个对象或访问某个对象存在困难时可以通过一个代理对象来间接访问,为了保证客户端使用的透明性,委托对象与代理对象需要实现相同的接口。 三、UML类图           四、参与者      1、接口类:Subje

小吕丶Code阶区 3845

设计模式--代理模式(Proxy Pattern)

代理模式(Proxy Pattern) 在有些情况下,一个客户不能或者不想直接访问另一个对象,这时需要找一个中介帮忙完成某项任务,这个中介就是代理对象。例如,购买火车票不一定要去火车站买,可以通过 12306 网站或者去火车票代售点买。又如找女朋友、找保姆、找工作等都可以通过找中介完成。 在软件设计中,使用代理模式的例子也很多,例如,要访问的远程对象比较大(如视频或大图像等),其下载要花很多时间。...

吴声子夜歌的博客 1138

Android设计模式之代理模式(Proxy Pattern)

代理模式介绍代理模式(Proxy Pattern)也称为委托模式,是结构型设计模式的一种,代理模式在各类开发中运用的相当广泛,不论是j2ee,android还是ios,都能看到它的身影,所以说设计模式无处不在。代理模式的定义:为其他对象提供一种代理以控制这个对象的访问。通俗一点:找别人做你想做但是做不了的事情。代理模式的UML类图,如图:角色介绍: (1) 抽象主题(Subject):定义了真实

happy_horse的博客 3872

代理模式 (Proxy Pattern)

代理模式是一种结构型设计模式,它为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

懵萌长颈鹿的博客 969
上一篇: Java设计模式 十二 享元模式 (Flyweight Pattern)
下一篇: Java设计模式 十四 行为型模式 (Behavioral Patterns)
十方来财
十方来财 新星创作者: 编程框架技术领域 新星创作者: 编程框架技术领域
博客等级 码龄14年 8359粉丝 346原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十方来财

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值