Java设计模式中代理模式应用详解

 更新时间:2022年11月25日 15:44:13   作者:lpf_wei  
代理模式(Proxy Parttern)为一个对象提供一个替身,来控制这个对象的访问,即通过代理对象来访问目标对象。本文将通过示例详细讲解一下这个模式,需要的可以参考一下

编程是一门艺术,大批量的改动显然是非常丑陋的做法,用心的琢磨写的代码让它变的更美观。

在有些情况下,一个客户不能或者不想直接访问另一个对象,这时需要找一个中介帮忙完成某项任务,这个中介就是代理对象。找女朋友、找保姆、找工作等都可以通过找中介完成。

在软件设计中,使用代理模式的例子也很多,例如,要访问的远程对象比较大(如视频或大图像等),其下载要花很多时间。还有因为安全原因需要屏蔽客户端直接访问真实对象,如某单位的内部数据库等。

1.代理设计模式定义

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

2.代理设计模式的优点与不足

代理模式的主要优点有:

  • 代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用;
  • 代理对象可以扩展目标对象的功能;
  • 代理模式能将客户端与目标对象分离,在一定程度上降低了系统的耦合度,增加了程序的可扩展性

其主要缺点是:

  • 代理模式会造成系统设计中类的数量增加
  • 在客户端和目标对象之间增加一个代理对象,会造成请求处理速度变慢;
  • 增加了系统的复杂度;

也可以考虑使用动态代理

3.代理设计模式的实现思路

代理模式的结构比较简单,主要是通过定义一个继承抽象主题的代理来包含真实主题,从而实现对真实主题的访问,下面来分析其基本结构和实现方法。

代理模式的主要角色如下:

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

4.代理设计模式代码示例

示例场景介绍:在拍摄预览的时候,可以渲染各种特效,比如:磨皮,美白,滤镜等,但是假如不能直接渲染美妆特效,那么美妆特效就可以使用代理的方式添加。

public interface IEffect {
    String renderEffect();

}
public class EffectImpl implements IEffect {
    @Override
    public String renderEffect() {
        System.out.println("渲染美白特效成功");
        return "美白";
    }
}
public class MakeUpEffectImpl implements IEffect {
    @Override
    public String renderEffect() {
        System.out.println("渲染美妆成功");
        return "美妆";
    }
}
public class ProxyOrder  implements IEffect {
    /**
     * 代理类持有被代理的对象 ,进行操作的时候,执行的是持有的代理类的相应逻辑
     */
    private IEffect orderService = new MakeUpEffectImpl();
    @Override
    public String renderEffect() {
        System.out.println("开始渲染美妆");
        orderService.renderEffect();
        System.out.println("渲染美妆结束");
        return "增加了美妆特效";
    }
}
 public static void main(String[] args) {
        IEffect orderService = new ProxyOrder();
        orderService.renderEffect();
 }

通过代理类,进行了美妆的渲染操作,并且进行打印,可以认为对功能进行了增强。

5.代理设计模式的应用场景

当无法或不想直接引用某个对象或访问某个对象存在困难时,可以通过代理对象来间接访问。使用代理模式主要有两个目的:一是保护目标对象,二是增强目标对象。

  • 远程代理,这种方式通常是为了隐藏目标对象存在于不同地址空间的事实,方便客户端访问。例如,用户申请某些网盘空间时,会在用户的文件系统中建立一个虚拟的硬盘,用户访问虚拟硬盘时实际访问的是网盘空间。
  • 虚拟代理,这种方式通常用于要创建的目标对象开销很大时。例如,下载一幅很大的图像需要很长时间,因某种计算比较复杂而短时间无法完成,这时可以先用小比例的虚拟代理替换真实的对象,消除用户对服务器慢的感觉。
  • 安全代理,这种方式通常用于控制不同种类客户对真实对象的访问权限。
  • 智能指引,主要用于调用目标对象时,代理附加一些额外的处理功能。例如,增加计算真实对象的引用次数的功能,这样当该对象没有被引用时,就可以自动释放它。
  • 延迟加载,指为了提高系统的性能,延迟对目标的加载。例如,Hibernate中就存在属性的延迟加载和关联表的延时加载。

到此这篇关于Java设计模式中代理模式应用详解的文章就介绍到这了,更多相关Java代理模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解SimpleDateFormat的线程安全问题与解决方案

    详解SimpleDateFormat的线程安全问题与解决方案

    这篇文章主要介绍了SimpleDateFormat的线程安全问题与解决方案,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-03-03
  • java中json和对象之间相互转换的运用

    java中json和对象之间相互转换的运用

    本文主要介绍了java中json和对象之间相互转换的运用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • 使用maven命令实现下载依赖jar

    使用maven命令实现下载依赖jar

    这篇文章主要介绍了使用maven命令实现下载依赖jar方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • java编程之递归算法总结

    java编程之递归算法总结

    这篇文章主要介绍了java编程之递归算法总结,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • spring应用中多次读取http post方法中的流遇到的问题

    spring应用中多次读取http post方法中的流遇到的问题

    这篇文章主要介绍了spring应用中多次读取http post方法中的流,文中给大家列举处理问题描述及解决方法,需要的朋友可以参考下
    2018-11-11
  • JAVA 内部类详解及实例

    JAVA 内部类详解及实例

    这篇文章主要介绍了JAVA 内部类详解及实例的相关资料,需要的朋友可以参考下
    2016-11-11
  • java面向对象设计原则之接口隔离原则示例详解

    java面向对象设计原则之接口隔离原则示例详解

    这篇文章主要为大家介绍了java面向对象设计原则之接口隔离原则的示例详解,有需要的朋友可以借鉴参考下希望能够有所帮助,祝大家多多进步早日升职加薪
    2021-10-10
  • Spring JDK动态代理实现过程详解

    Spring JDK动态代理实现过程详解

    这篇文章主要介绍了Spring JDK动态代理实现过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • spring security4 添加验证码的示例代码

    spring security4 添加验证码的示例代码

    本篇文章主要介绍了spring security4 添加验证码的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02
  • 通过实例讲解springboot整合WebSocket

    通过实例讲解springboot整合WebSocket

    这篇文章主要介绍了通过实例讲解springboot整合WebSocket,WebSocket为游览器和服务器提供了双工异步通信的功能,即游览器可以向服务器发送消息,服务器也可以向游览器发送消息。,需要的朋友可以参考下
    2019-06-06

最新评论