概括

名称

Proxy

结构

动机

为其他对象提供一种代理以控制对这个对象的访问。

适用性

  • 在需要用比较通用和复杂的对象指针代替简单的指针的时候,使用P r o x y 模式。下面是一 些可以使用P r o x y 模式常见情况:

  • 1) 远程代理(Remote Proxy )为一个对象在不同的地址空间提供局部代表。 NEXTSTEP[Add94] 使用N X P r o x y 类实现了这一目的。Coplien[Cop92] 称这种代理为?大使? (A m b a s s a d o r )。

  • 2 )虚代理(Virtual Proxy )根据需要创建开销很大的对象。在动机一节描述的I m a g e P r o x y 就是这样一种代理的例子。

  • 3) 保护代理(Protection Proxy )控制对原始对象的访问。保护代理用于对象应该有不同 的访问权限的时候。例如,在C h o i c e s 操作系统[ C I R M 9 3 ]中K e m e l P r o x i e s 为操作系统对象提供 了访问保护。

  • 4 )智能指引(Smart Reference )取代了简单的指针,它在访问对象时执行一些附加操作。 它的典型用途包括:

  • 对指向实际对象的引用计数,这样当该对象没有引用时,可以自动释放它(也称为S m a r tP o i n t e r s[ E d e 9 2 ] )。

  • 当第一次引用一个持久对象时,将它装入内存。

  • 在访问一个实际对象前,检查是否已经锁定了它,以确保其他对象不能改变它。

解析

形象比喻:

跟MM在网上聊天, 一开头总是,“hi, 你好”,“你从哪儿来呀?”,“你多大了?”,“身高多少呀?” 这些话,真烦人, 写个程序做为我的Proxy 吧, 凡事接收到这些话都设置好自动的回答,接收到其他的话时再通知我回答,怎么样。

代理模式中的“代理商”要想实现代理任务, 就必须和被代理的“厂商”使用共同的接口。于是代理模式就有三个角色组成了:

1) 抽象主题角色: 声明了真实主题和代理主题的共同接口

2) 代理主题角色: 内部包含了对真实主题的应用, 并且提供和真实主题角色相同的接口

3) 真实主题对象: 定义真实的对象

代理模式能够协调调用者和被调用者, 能够在一定程度上降低系统的耦合度。代理模式中真实主题角色可以结合组合模式来构造,这要一个代理主题角色就可以对一系列这是主题角色有效,提高代码的利用率,较少不必要子类的产生。

实例

涉及的文件:

抽象角色 Subject.java

真实角色 -RealSubject.java

代理角色 - ProxySubject.java

测试类: TestMain.java

/**   * @author oscar999   * @date 2014-4-28* @version V1.0   */
package designptn.proxy;public abstract class Subject {abstract public void request();
}
/**   * @author oscar999   * @date 2014-4-28* @version V1.0   */
package designptn.proxy;public class RealSubject extends Subject {public RealSubject(){}@Overridepublic void request() {System.out.println("From real subject.");}}
/**   * @author oscar999   * @date 2014-4-28* @version V1.0   */
package designptn.proxy;public class ProxySubject extends Subject {private RealSubject realSubject;public ProxySubject() {}@Overridepublic void request() {// preRequest();if (realSubject == null) {realSubject = new RealSubject();}realSubject.request();// postRequest();}}
/**   * @author oscar999   * @date 2014-4-28* @version V1.0   */
package designptn.proxy;public class TestMain {public static void main(String[] args) {// TODO Auto-generated method stubSubject sub = new ProxySubject();sub.request();}}
远程代理可以将网络的细节隐藏起来,使得客户端不必考虑网络的存在
对于一些占用系统资源较多或者加载时间较长的对象,可以给这些对象提供一个虚拟代理
缓冲代理(Cache Proxy)也是一种较为常用的代理模式,它为某一个操作的结果提供临时的缓存存储空间,以便在后续使用中能够共享这些结果,从而可以避免某些方法的重复执行,优化系统性能

[设计模式-结构型]代理模式(Proxy)相关推荐

  1. JAVA设计模式(09):结构型-代理模式(Proxy)

    代理模式是经常使用的结构型设计模式之中的一个,当无法直接訪问某个对象或訪问某个对象存在困难时能够通过一个代理对象来间接訪问,为了保证client使用的透明性,所訪问的真实对象与代理对象须要实现同样的接 ...

  2. Java24种设计模式(第二种)--代理模式(Proxy Pattern)

    Java24种设计模式 (第二种) 一.代理模式(Proxy Pattern) 模式逻辑: 什么是代理模式呢?我很忙,忙的没空理你,那你要找我呢就先找我的代理人吧,那代理人总要知道 被代理人能做哪些事 ...

  3. 设计模式之略见一斑(代理模式Proxy)

    普通对象所需要完成的任务就是通过公共接口为外界提供自己所承诺的服务.然而,有时候合法的对象可能会因为各种原因而无法完成自己常规的任务.尤其是当对象需要长时候才能载入内存.对象正运行在另一台计算机上或者 ...

  4. GOF设计模式之外观模式(结构型代理模式)

  5. GOF设计模式之代理模式(结构型代理模式)

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

    #pragma once#ifndef PROXY_H #define PROXY_H // 定义了Proxy 和RealSubject 的公有接口, // 这样就可以在任何需要使用到RealSubj ...

  7. [设计模式-结构型]外观模式(Facade)

    概括 名称 Facade 结构 动机 为子系统中的一组接口提供一个一致的界面,F a c a d e 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 适用性 当你要为一个复杂子系统提供一 ...

  8. Java设计模式-结构型-门面模式

    目录 前言 示例 前言 门面模式(也叫外观模式,Facade Pattern)在许多源码中有使用,比如 slf4j 就可以理解为是门面模式的应用.这是一个简单的设计模式,我们直接上代码再说吧. 示例 ...

  9. 设计模式(结构型)之代理模式(Proxy Pattern)

    PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbob ...

最新文章

  1. 深入浅出Websocket(二)分布式Websocket集群
  2. iOS ARC环境下dealloc的使用
  3. MySql数据同步FEDERATED引擎
  4. 具有JDK 12精简数字格式的自定义精简数字模式
  5. 前端学习(2386):远程仓库的issue
  6. 虚拟主机选择php版本,虚拟主机的php版本如何选择
  7. 春招平均薪酬最高的职业TOP10
  8. tecplot对数坐标轴怎么画_一次更换双速风机接线经历,想通了改变磁极对数原理...
  9. java判断字符串是否为乱码
  10. docker深入2-API示例
  11. SpringBoot+Shiro 学习之数据库动态权限管理和 Redis 缓存
  12. python正则表达式 身份证_正则表达式实现身份证信息验证
  13. CSDN博文写作规范文档
  14. 【图像去噪】基于自适应布谷鸟算法优化维纳滤波器实现多光谱图像去噪附matlab代码
  15. Mapped Statements collection already contains value
  16. linux 代码格式化工具下载,Linux 代码格式化工具 indent
  17. android hierarchyViewer 的UI工具的使用
  18. linux- 日志管理
  19. 高通MDM平台开发入门
  20. HOUDINI TIP | USING HOU MODULE IN VISUAL STUDIO CODE_手动在vscode里设置houdiniPython模块

热门文章

  1. keepalived + LVS实现高可用负载均衡集群
  2. LinkedList 源码小解
  3. ES6--Let 和 const 命令
  4. h5 做app时和原生交互的小常识。
  5. Basic--Java基本语法
  6. 算法:求两个数最大公约数
  7. org.springframework.web.context.ContextLoaderListener 解决方案
  8. KDD2021|小红书在推荐多样化的实践——SSD
  9. 万物皆可Graph | 当推荐系统遇上图神经网络(二)
  10. 知识图谱|各生命周期主流算法 实践