Java 与设计模式(13):代理模式

这篇具有很好参考价值的文章主要介绍了Java 与设计模式(13):代理模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、定义

代理模式是一种结构型设计模式,用于在访问对象时引入一个代理对象,以控制对实际对象的访问。代理对象充当了客户端和实际对象之间的中介,客户端通过代理对象间接地访问实际对象,从而可以在访问过程中添加额外的逻辑或控制。代理模式可以提供对实际对象的保护、延迟加载、缓存等功能,同时也可以实现远程代理、虚拟代理、安全代理等不同的应用场景。

二、Java示例

以下是一个简单的Java示例,展示了代理模式的使用:

// 定义一个接口
interface Image {
    void display();
}

// 实际对象
class RealImage implements Image {
    private String filename;

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

    private void loadFromDisk() {
        System.out.println("从磁盘加载图片:" + filename);
    }

    @Override
    public void display() {
        System.out.println("显示图片:" + filename);
    }
}

// 代理对象
class ProxyImage implements Image {
    private String filename;
    private RealImage realImage;

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

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

// 客户端代码
public class ProxyPatternExample {
    public static void main(String[] args) {
        // 使用代理对象访问图片
        Image image = new ProxyImage("image.jpg");
        image.display();
        System.out.println();

        // 图片已经加载过,直接使用实际对象访问图片
        image.display();
    }
}

在上面的示例中,Image接口定义了显示图片的方法。RealImage类实现了该接口,并在构造函数中加载实际图片文件。ProxyImage类也实现了Image接口,并在display方法中判断是否需要创建实际对象,如果需要则创建并显示实际图片,否则直接显示已加载的图片。客户端代码通过代理对象访问图片,代理对象在必要时创建实际对象并进行图片的显示。

这个示例展示了代理模式的延迟加载功能,只有在需要显示图片时才会加载实际图片对象,提高了性能和资源的利用效率。

三、优点

代理模式具有以下优点:

  1. 代理模式能够实现对实际对象的保护,客户端通过代理对象访问实际对象,可以在代理对象中添加额外的逻辑或控制,从而对实际对象进行保护。例如,可以在代理对象中添加权限验证、安全检查等功能,确保只有具有合适权限的客户端能够访问实际对象。

  2. 代理模式可以实现延迟加载,只有在需要时才会创建和加载实际对象。这对于一些资源消耗较大的对象或者需要耗费较长时间初始化的对象来说非常有用。通过代理对象进行访问,可以避免不必要的对象创建和加载,提高了性能和资源的利用效率。

  3. 代理模式可以实现对实际对象的控制。通过代理对象,可以对客户端的请求进行过滤、验证、转发等操作,从而对实际对象的访问进行控制。这种控制可以用于实现缓存、记录日志、限流等功能,提供更灵活和可扩展的访问控制能力。

  4. 代理模式可以实现远程代理。通过代理对象,可以在不同的地址空间或进程中访问实际对象,实现远程通信。这对于分布式系统和跨网络的应用非常有用,可以将实际对象隐藏在远程服务器中,客户端通过代理对象进行访问。

  5. 代理模式可以实现虚拟代理。在某些情况下,实际对象的创建和初始化可能非常耗时,或者需要消耗大量的资源。通过代理对象,可以先使用一个轻量级的虚拟代理对象进行访问,等到真正需要使用实际对象时再创建和加载,从而实现对实际对象的懒加载和优化。

代理模式具有保护、延迟加载、控制、远程代理和虚拟代理等优点,可以在不改变客户端代码的情况下,为实际对象提供额外的功能和控制。

四、缺点

代理模式也有一些缺点:

  1. 增加了系统复杂性:引入代理对象会增加系统中的类和对象数量,增加了系统的复杂性和理解难度。如果代理对象的设计不合理,可能会导致代码冗余和维护困难。

  2. 增加了访问时间:由于代理对象介入了客户端和实际对象之间的访问过程,会增加一定的访问时间。尤其是在远程代理或虚拟代理的情况下,网络通信或对象加载等操作会带来额外的延迟。

  3. 可能引入单点故障:在使用远程代理时,如果代理对象或远程服务器出现故障,可能会导致整个系统无法正常工作。因此,在设计远程代理时需要考虑故障恢复和容错机制,以提高系统的可靠性和稳定性。

  4. 需要额外的资源消耗:代理模式可能会引入额外的资源消耗,例如内存消耗、网络带宽占用等。特别是在使用虚拟代理时,需要维护虚拟对象和实际对象之间的状态同步,可能会带来额外的开销。

  5. 可能影响系统性能:如果代理对象的设计不合理或实现不高效,可能会对系统的性能产生负面影响。特别是在频繁访问实际对象的场景下,代理模式可能会成为系统的瓶颈。

五、使用场景

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

  1. 远程代理:当需要在不同的地址空间或进程中访问对象时,可以使用代理模式实现远程代理。代理对象可以隐藏实际对象的具体实现细节,客户端通过代理对象进行远程通信,实现跨网络的对象访问。

  2. 虚拟代理:当创建和初始化实际对象需要耗费大量时间或资源时,可以使用代理模式实现虚拟代理。代理对象先使用一个轻量级的虚拟对象进行访问,等到真正需要使用实际对象时再创建和加载,从而实现懒加载和性能优化。

  3. 安全代理:当需要对实际对象进行访问控制和权限验证时,可以使用代理模式实现安全代理。代理对象可以在访问实际对象之前进行身份验证、权限检查等操作,确保只有具有合适权限的客户端能够访问实际对象。

  4. 缓存代理:当需要对频繁访问的数据进行缓存,以提高性能时,可以使用代理模式实现缓存代理。代理对象可以在访问实际对象之前先检查缓存,如果缓存中存在数据,则直接返回缓存数据,避免重复计算或查询。

  5. 日志记录:当需要记录对象的访问日志或操作日志时,可以使用代理模式实现日志代理。代理对象可以在访问实际对象之前或之后记录相关日志信息,用于跟踪和分析对象的使用情况。

需要注意的是,在使用代理模式时要注意权衡利弊,避免过度使用代理导致系统复杂性增加和性能下降。根据具体的应用场景和需求,选择合适的代理模式变体和实现方式。

六、注意事项

在使用代理模式时,需要注意以下几个事项:

  1. 明确代理的角色和责任:在设计代理模式时,需要明确代理对象的角色和责任。代理对象应该只负责对实际对象的访问进行控制和管理,而不应该承担过多的业务逻辑。过多的业务逻辑应该放在实际对象中处理,保持代理对象的简洁和高效。

  2. 考虑代理对象的创建和生命周期:代理对象的创建和生命周期管理也是需要考虑的问题。根据具体的应用场景,可以选择在需要时动态创建代理对象,或者使用静态代理对象进行访问。同时,需要确保代理对象的创建和销毁不会影响系统的性能和稳定性。

  3. 考虑并发和线程安全性:在多线程环境下使用代理模式时,需要考虑并发和线程安全性。如果代理对象被多个线程同时访问,需要确保代理对象的状态同步和线程安全性。可以使用同步机制或其他线程安全的方式来保证代理对象的正确性。

  4. 避免过度使用代理:代理模式虽然可以提供很多好处,但过度使用代理可能会导致系统复杂性增加、性能下降等问题。在使用代理模式时,需要根据具体的需求和场景,权衡利弊,避免过度设计和不必要的代理对象。

  5. 考虑代理模式的性能影响:引入代理对象会增加系统的访问时间和资源消耗。在使用代理模式时,需要评估代理对象对系统性能的影响,并进行性能优化和测试,确保代理模式不会成为系统的瓶颈。

总之,使用代理模式需要明确代理的角色和责任,合理管理代理对象的创建和生命周期,考虑并发和线程安全性,避免过度使用代理,并对代理模式的性能影响进行评估和优化。

七、在spring 中的应用

在Spring框架的源码中,代理模式被广泛应用于不同的功能和模块。以下是一些Spring框架中使用代理模式的典型应用:

  1. AOP(面向切面编程):Spring的AOP模块使用代理模式来实现切面功能。通过代理对象,Spring可以在目标对象的方法执行前、后或者异常抛出时插入额外的逻辑,例如日志记录、事务管理等。在Spring中,可以使用JDK动态代理或者CGLIB代理来创建切面代理对象。

  2. 事务管理:Spring的事务管理模块使用代理模式来实现声明式事务。通过代理对象,Spring可以在方法执行前后进行事务的开启、提交或回滚等操作。代理对象会对被代理的对象进行包装,以提供事务管理的功能。

  3. 远程访问:Spring的远程访问模块使用代理模式来实现远程调用。通过代理对象,Spring可以将方法调用转发到远程服务器上的实际对象,并将结果返回给客户端。代理对象隐藏了远程调用的细节,使得客户端可以像调用本地对象一样调用远程对象。

  4. 延迟加载:Spring的延迟加载模块使用代理模式来实现对象的懒加载。通过代理对象,Spring可以将对象的初始化延迟到第一次访问时进行,从而提高系统的性能和资源利用率。代理对象在第一次访问时会创建和加载实际对象。

  5. 缓存管理:Spring的缓存管理模块使用代理模式来实现缓存功能。通过代理对象,Spring可以在方法执行前检查缓存,如果缓存中存在结果,则直接返回缓存数据,避免重复计算或查询。代理对象在方法执行后会将结果存入缓存。

在Spring框架中,代理模式的应用使得开发者可以通过配置和注解来实现一些常见的功能,如事务管理、AOP等,而无需手动编写大量的重复代码。代理模式提供了一种灵活和可扩展的方式来增强对象的功能和控制访问。文章来源地址https://www.toymoban.com/news/detail-705037.html

到了这里,关于Java 与设计模式(13):代理模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于Java的设计模式 - 代理模式

    代理模式是一种使用代理对象来执行目标对象的方法并在代理对象中增强目标对象方法的一种设计模式。简单来讲就是在不修改目标对象的基础上,增强主业务逻辑的设计模式。 代理模式基本可分为三种 静态代理 JDK动态代理 CGLIB动态代理 上述简单分就是静态和动态代理,静

    2024年02月07日
    浏览(28)
  • Java设计模式中的代理模式

    Java设计模式中的代理模式 代理模式是一种结构型设计模式,它提供了一个代理对象,以控制对其他对象的访问。代理可以充当中介,用于控制对真实对象的访问。 代码举例演示 静态代理: 动态代理 区别: 静态代理: 代理类在编译时就已经确定,并且需要为每个被代理的

    2024年01月25日
    浏览(32)
  • 【Java 设计模式】结构型之代理模式

    代理模式(Proxy Pattern)是一种结构型设计模式, 它允许通过一个代理对象控制对其他对象的访问 。代理模式在访问对象时引入了一定程度的间接性,使得可以在访问对象前后进行一些额外的操作。在本文中,我们将深入研究Java中代理模式的定义、结构、使用场景以及如何在

    2024年01月21日
    浏览(38)
  • Java设计模式之代理模式--经纪人的工作

    本文主要讲述 代理模式 ,文中使用通俗易懂的案例,使你更好的学习本章知识点并理解原理,做到有道无术。 代理模式是23种设计模式中 结构型模式 的一种,它的核心是通过代理类来完成其他对象的访问,降低访问者和被访问者的耦合度,也对功能进行了增强。 每个艺人

    2024年02月09日
    浏览(31)
  • Java复习-20-接口(3)- 代理设计模式

    功能:可以帮助用户将所有的开发注意力只集中在核心业务功能的处理上。 代理模式(Proxy Pattern)是一种结构性模式。代理模式为一个对象提供了一个替身,以控制对这个对象的访问。即通过代理对象访问目标目标对象,可以在目标对象实现的基础上,增强额外的功能操作,即

    2024年02月09日
    浏览(29)
  • Java 设计者模式以及与Spring关系(四) 代理模式

    目录 简介: 23设计者模式以及重点模式 代理模式(Proxy Pattern) 静态代理示例 spring中应用 动态代理 1.基于JDK的动态代理 target.getClass().getInterfaces()作用 内名内部类写法(更简洁,但不推荐) 2.基于CGLIB实现 spring中应用 本文是个系列一次会出两个设计者模式作用,如果有关联就三

    2024年01月23日
    浏览(34)
  • JAVA设计模式6:代理模式,用于控制对目标对象的访问

    作者主页 :Designer 小郑 作者简介 :3年JAVA全栈开发经验,专注JAVA技术、系统定制、远程指导,致力于企业数字化转型,CSDN博客专家,阿里云社区专家博主,蓝桥云课讲师。 代理模式是一种常用的设计模式,它提供了一个代理对象,用于控制对目标对象的访问 。 在代理模式

    2024年02月07日
    浏览(33)
  • 【设计模式——学习笔记】23种设计模式——代理模式Proxy(原理讲解+应用场景介绍+案例介绍+Java代码实现)

    代理模式 为一个对象提供一个代理对象,以控制对这个对象的访问 。即通过代理对象访问目标对象,这样做的好处是:可以在不修改目标对象代码的基础上,增强额外的功能操作,即扩展目标对象的功能 被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对

    2024年02月14日
    浏览(31)
  • 【Java面试题】设计模式之七种结构性模式——代理模式、适配器模式、桥接模式、装饰模式、外观模式、享元模式、组合模式

    目录 一、代理模式 二、适配器模式 三、桥接模式 四、装饰模式 五、外观模式 六、享元模式 七、组合模式 概念: 代理模式是为其他对象提供一种以代理控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对

    2023年04月09日
    浏览(41)
  • 【Java基础教程】(十五)面向对象篇 · 第九讲:抽象类和接口——定义、限制与应用的细节,初窥模板设计模式、工厂设计模式与代理设计模式~

    掌握 抽象类和接口的定义、使用、区别、常见设计模式; 抽象类是代码开发中的重要组成部分,利用抽象类可以明确地定义子类需要覆写的方法,这样相当于在语法程度上对子类进行了严格的定义限制,代码的开发也就更加标准。下面具体介绍抽象类的概念。 普通类可以直

    2024年02月16日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包