• 设计模式之代理模式


      代理模式,属于结构型设计模式,它是使用者和对象之间的访问层。

      定义:为其它对象提供一种代理以控制对这个对象的访问。

      问题描述:有些对象由于某些原因,如对象的创建开销很大或者一些安全控制,直接访问会给系统增加没必要的负担。

      解决方案:在使用者和对象之间增加一个代理类,通过代理类来创建对象以及对此对象的一些访问控制。

      结构图

      举个栗子:讲一个购买火车票的故事。。。

      我们都知道,购买火车票的方式有很多种,直接在火车站购票,可以在代售点购票,也可以在网上购票,代售点和网络都属于代理,三种购票方式的区别为:火车站购票,可以退票,获得的是纸质票;代售点购票,不可以退票,获得的是纸质票;网上购票,可以退票,获得的是电子票。使用代理模式,实现对三种购票方式的权限进行控制,具体实现方式如下:

      1. 新增一个抽象购票类BuyTickets,定义一些具体购票类和购票代理类需要实现的方法。代码如下:

             

      2. 新增一个普通购票类TrainTickets,实现抽象购票类总定义的方法。代码如下:

             

      3. 新增一个购票代理类ProxyBuyTickets,同样实现抽象购票类总定义的方法,以及自己的方法。代码如下:

             

      4. 在使用者类中通过代理类的实例分别实现三种购票方式的功能。代码如下:

             

      5. 运行后的效果,如图所示:

             

      以上是静态代理的实现方式,代理类就是使用者和对象之间的访问层,通过给代理类传入参数来指定所需要的功能,对对象的访问做了一些控制,避免了去创建一些无关的对象,节省了内存。

      动态代理实现比较简单,直接上代码了:

             

             

      优点:对实际访问的对象进行控制,并可以添加额外的功能;不同的代理器可以实现不同的功能,提高了系统的可扩展性。

      缺点:需要额外的工作,有些代理模式的实现比较复杂,也可能造成请求的处理速度很慢。

      适用场景

      1. 远程代理:使得客户端可以访问远程主机上的对象,远程主机上的对象可能有更良好的性能和处理速度,并且可以向客户隐藏网络细节,有代理对象来处理网络连接和通信工作。

      2. 虚拟代理:对于一些加载时间比较长或者占用系统资源比较多的对象,可以创建虚拟对象来先行处理与客户端的交互,再有虚拟代理转发对应的请求给真实的对象。

      3. 缓冲代理:对于一些操作频繁,而且每次操作消耗比较大的对象可以代用缓冲代理的方式,建立临时的缓冲空间,统一进行批量处理。

  • 相关阅读:
    进程详解
    java 实体对象与Map之间的转换工具类(自己还没看)
    fastjson中toString与toJSONString的差别
    JSONObject.toJSONString()包含或排除指定的属性
    FastJson中JSONObject用法及常用方法总结
    SpringBoot之ApplicationRunner接口和@Order注解
    shiro使用
    RedisTemplate 中 opsForHash()使用 (没有测试过,copy的)
    解决:javax.servlet.ServletException: Circular view path []: would dispatch back to the current....
    【Springboot】spring-boot-starter-redis包报错 :unknown
  • 原文地址:https://www.cnblogs.com/chenxkang/p/6769782.html
Copyright © 2020-2023  润新知