一、代理模式

代理模式,即Proxy,让你能够提供对象的替代品或其占位符。 代理控制着对于原对象的访问, 并允许在将请求提交给对象前后进行一些处理。它和Adapter模式很类似。我们先回顾Adapter模式,它用于把A接口转换为B接口:

public BAdapter implements B {private A a;public BAdapter(A a) {this.a = a;}public void b() {a.a();}
}

而Proxy模式不是把A接口转换成B接口,它还是转换成A接口:

public AProxy implements A {private A a;public AProxy(A a) {this.a = a;}public void a() {this.a.a();}
}

二、 为什么要使用代理模式控制对于某个对象的访问呢

为什么要使用代理模式控制对于某个对象的访问呢? 举个例子: 有这样一个消耗大量系统资源的巨型对象, 你只是偶尔需要使用它, 并非总是需要。

代理模式解决的问题

  1. 数据库查询有可能会非常缓慢。你可以实现延迟初始化: 在实际有需要时再创建该对象。 对象的所有客户端都要执行延迟初始代码。 不幸的是, 这很可能会带来很多重复代码。

  2. 在理想情况下, 我们希望将代码直接放入对象的类中, 但这并非总是能实现: 比如类可能是第三方封闭库的一部分。

  1. 解决方案

代理模式建议新建一个与原服务对象接口相同的代理类, 然后更新应用以将代理对象传递给所有原始对象客户端。 代理类接收到客户端请求后会创建实际的服务对象, 并将所有工作委派给它。

  1. 代理模式的解决方案

代理将自己伪装成数据库对象, 可在客户端或实际数据库对象不知情的情况下处理延迟初始化和缓存查询结果的工作。

这有什么好处呢? 如果需要在类的主要业务逻辑前后执行一些工作, 你无需修改类就能完成这项工作。 由于代理实现的接口与原类相同, 因此你可将其传递给任何一个使用实际服务对象的客户端。

三、代理模式的结构


很重要的一点就是:代理类必须和服务对象实现相同的接口,才能伪装成服务对象

四、代码实现及详解

参考

五、 代理模式适合应用场景

使用代理模式的方式多种多样, 我们来看看最常见的几种。

  1. 延迟初始化 (虚拟代理)。 如果你有一个偶尔使用的重量级服务对象, 一直保持该对象运行会消耗系统资源时, 可使用代理模式。

  2. 你无需在程序启动时就创建该对象, 可将对象的初始化延迟到真正有需要的时候。

  3. 访问控制 (保护代理)。 如果你只希望特定客户端使用服务对象, 这里的对象可以是操作系统中非常重要的部分, 而客户端则是各种已启动的程序(包括恶意程序), 此时可使用代理模式。

4.代理可仅在客户端凭据满足要求时将请求传递给服务对象。

  1. 本地执行远程服务 (远程代理)。 适用于服务对象位于远程服务器上的情形。

  2. 在这种情形中, 代理通过网络传递客户端请求, 负责处理所有与网络相关的复杂细节。

  3. 记录日志请求 (日志记录代理)。 适用于当你需要保存对于服务对象的请求历史记录时。 代理可以在向服务传递请求前进行记录。

  4. 缓存请求结果 (缓存代理)。 适用于需要缓存客户请求结果并对缓存生命周期进行管理时, 特别是当返回结果的体积非常大时。

  • 代理可对重复请求所需的相同结果进行缓存, 还可使用请求参数作为索引缓存的键值。
  1. 智能引用。可在没有客户端使用某个重量级对象时立即销毁该对象。

  2. 代理会将所有获取了指向服务对象或其结果的客户端记录在案。

  3. 代理会时不时地遍历各个客户端, 检查它们是否仍在运行。
    如果相应的客户端列表为空, 代理就会销毁该服务对象, 释放底层系统资源。 代理还可以记录客户端是否修改了服务对象。 其他客户端还可以复用未修改的对象。

六、与其他模式的关系

  1. 适配器模式能为被封装对象提供不同的接口, 代理模式能为对象提供相同的接口, 装饰模式则能为对象提供加强的接口。

  2. 外观模式与代理的相似之处在于它们都缓存了一个复杂实体并自行对其进行初始化。 代理与其服务对象遵循同一接口, 使得自己和服务对象可以互换,在这一点上它与外观不同。

  3. 装饰和代理有着相似的结构, 但是其意图却非常不同。 这两个模式的构建都基于组合原则, 也就是说一个对象应该将部分工作委派给另一个对象。两者之间的不同之处在于代理通常自行管理其服务对象的生命周期, 而装饰的生成则总是由客户端进行控制。

参考文章
参考文章

代理模式(为对象提供相同的接口)相关推荐

  1. 装饰者模式(为对象提供加强的接口)

    一.装饰者模式 装饰者模式:允许你通过将对象放入包含行为的特殊封装对象中来为原来的对象绑定新的行为,相比生成子类更加灵活.是一种在运行期动态给某个对象的实例增加功能的方法.如:在IO的Filter模式 ...

  2. 适配器模式(为被封装对象提供不同的接口)

    一.适配器讲解 说到适配器,我们最熟悉的莫过于电源适配器了,也就是手机的充电头.它就是适配器模式的一个应用.试想一下,你有一条连接电脑和手机的 USB 数据线,连接电脑的一端从电脑接口处接收 5V 的 ...

  3. 代理模式(Proxy Design Pattern)及代码实现

    什么是 代理模式? 代理模式 通过名字 得知, 是提供 一个第三方 服务 给 客户端使用,这个第三方服务 对接 真实服务,并且 实现了 真实服务 功能,并且还增加了 额外的功能; 生活中的例子 123 ...

  4. Java 设计模式_代理模式(2016-08-19)

    概念: 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 就是一个人或者机构代表另一个人或者机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一 ...

  5. 【java项目实战】代理模式(Proxy Pattern),静态代理 VS 动态代理

    这篇博文,我们主要以类图和代码的形式来对照学习一下静态代理和动态代理.重点解析各自的优缺点. 定义 代理模式(Proxy Pattern)是对象的结构型模式,代理模式给某一个对象提供了一个代理对象,并 ...

  6. Java设计模式(代理模式-模板方法模式-命令模式)

    Java设计模式Ⅴ 1.代理模式 1.1 代理模式概述 1.2 静态代理 1.2.1 静态代理概述 1.2.2 代码理解 1.3 动态代理之JDK代理 1.3.1 动态代理之JDK代理概述 1.3.2 ...

  7. Binder通信中的代理模式

    1. 模式介绍 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 模式的使用场景 就是一个人或者机构代表另一个人或者机构采取行动.在一些情况下,一个客户 ...

  8. 轻松学,Java 中的代理模式(proxy)及动态代理

    我们先来分析代理这个词. 代理 代理是英文 Proxy 翻译过来的.我们在生活中见到过的代理,大概最常见的就是朋友圈中卖面膜的同学了. 她们从厂家拿货,然后在朋友圈中宣传,然后卖给熟人. 按理说,顾客 ...

  9. 通俗易懂的讲解一下Java的代理模式

    一.基本概念 代理模式是对象的结构模式. 代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用(接口的引用) 二.静态代理 静态代理是指,代理类在程序运行前就已经定义好,其与**目标类 ...

最新文章

  1. android 悬浮窗权限,Android 悬浮窗权限校验
  2. python读取xml数据并显示为表格_用Python解析XML数据,然后用SQL创建一个数据库
  3. 类别选择器在HTML中如何表示,CSS类别选择器
  4. 展开收起功能实现_Windows10自带的7大隐藏功能,个个都实用!
  5. 【博客征文】畅谈百度轻应用初体验
  6. HTML多选框滚动条,08:HTMLayout 自定义滚动条样式
  7. 跑步(【CCF】NOI Online能力测试 入门组第二题)
  8. [转]MIDI常识20条
  9. 如何获得getElementById的length这个数值?
  10. 论文笔记_S2D.37_2015-TPAMI_使用深度卷积神经场从单目图像学习深度
  11. 推荐阅读20100603
  12. mysql实时监控工具
  13. 计算机表格制作ppt,成为 PPT 表格制作高手,就是这么简单!
  14. 【T3】打印凭证没有任何反应
  15. 医院患者随访工作信息化建设可行性报告
  16. ERP/WMS仓库管理系统库存商品成本计算
  17. APNS(Apple Push Notification Service)远程推送原理解析
  18. java技术总监_技术总监-JAVA岗位职责
  19. 魔兽世界燃烧的远征服务器状态,魔兽世界燃烧的远征前夕补丁 燃烧的远征副本介绍...
  20. 微信小程序5-真机测试

热门文章

  1. WPF编程,TextBlock中的文字修饰线(上划线,中划线,基线与下划线)的使用方法。...
  2. 并发编程知识点一张图总结
  3. Codeforces Round #361 (Div. 2) E. Mike and Geometry Problem 【逆元求组合数 离散化】
  4. Spring IO Platform简介及示例
  5. Sprint第三阶段(第四天12.12)
  6. ACM题目————次小生成树
  7. HDU 2852 KiKi's K-Number 主席树
  8. 风讯dotNETCMS源码分析—数据存取篇
  9. Deepfacelab的填坑之旅
  10. Python入门二(1)