为还有一个对象提供一个替身或占位符以控制对这个对象的訪问。

代理模式的组成:

主题接口(Subject):提取真正主题与代理的公共方法,让使用真正主题的地方也能用代理取代。

真正主题(RealSubject):真正处理请求的类。

代理(Proxy):真正主题的代理类,请求方通过调用代理对象间接调用真正主题。

代理模式的简单样例:

(主题接口类)Subject.java

package xu.neng.Proxy;

public interface Subject {
public void request();
}

(正真主题类)RealSubject.java

package xu.neng.Proxy;

public class RealSubject implements Subject{
@Override
public void request() {
System.out.println("竟敢调用我!!!");
}
}

(代理类)Proxy.java

package xu.neng.Proxy;

//必须和被代理对象继承统一接口
public class Proxy implements Subject {
RealSubject realSubject; public Proxy() {
this.realSubject = new RealSubject();
} // 从构造方法中传入被代理的对象
public Proxy(RealSubject realSubject) {
this.realSubject = realSubject;
} // 调用方法
@Override
public void request() {
realSubject.request();
}
}

(測试类,即Client)Test.java

package xu.neng.Proxy;

/**
* 測试代理模式。(相当于UML图中的Client)
*
* @author neng
*
*/
public class Test {
public static void main(String[] args) {
// 我想调用RealSubject出来玩玩
Proxy proxy = new Proxy(new RealSubject());
proxy.request();
}
}

代理模式的应用:



iOS开发中经常使用。代理模式更像是一种思想,通过中间手段来控制正真对象的訪问,同一时候还能够做一些包装。

防火墙代理:控制网络资源的訪问、保护主题免于坏客户的侵害。

智能引用代理:当主题被引用时,能够进行额外的动作。如进行引用计数等。

缓存代理:为开销大的运算结果提供暂时存储。同意多个客户共享结果,以降低计算或网络延迟。(本质上还是额外做其它事情)

同步代理:多线程时,为主题提供安全的訪问。

写入时复制代理:用来控制(延迟)对象的复制,直到客户真的须要为止。



參考一篇非常有意思的文章:http://yangguangfu.iteye.com/blog/815787



转载请注明出处:http://blog.csdn.net/xn4545945  





设计模式----代理模式(Proxy)的更多相关文章

  1. 设计模式——代理模式(Proxy Pattern)

    代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问. UML图: 模型设计: Subject类: package com.cnblog.clarck; /** * Subject 类 ...

  2. 设计模式 - 代理模式(proxy pattern) 未使用代理模式 具体解释

    代理模式(proxy pattern) 未使用代理模式 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 部分代码參考: http://blog.csdn. ...

  3. 设计模式--代理模式Proxy(结构型)

    一.代理模式 为其他对象提供一种代理以控制对这个对象的访问. 代理模式分为四种: 远程代理:为了一个对象在不同的地址空间提供局部代表.这样可以隐藏一个对象存在于不同地址空间的事实. 虚拟代理:根据需要 ...

  4. C#设计模式——代理模式(Proxy Pattern)

    一.概述在软件开发中,有些对象由于创建成本高.访问时需要与其它进程交互等原因,直接访问会造成系统速度慢.复杂度增大等问题.这时可以使用代理模式,给系统增加一层间接层,通过间接层访问对象,从而达到隐藏系 ...

  5. 设计模式-代理模式(Proxy)

    应用场景: 领导都有秘书,一般会代理领导的部分职能角色,处理签字.报销.开会等任务.很多新人可能都只知道秘书的存在,毕竟每天与其打交道,不知道领导的存在.但是领导的的确确是真实存在的. 场景说明: 代 ...

  6. 大话设计模式--代理模式 proxy

    1. 代理模式: 为其他对象提供一种代理以控制这个对象的访问. 代理模式使用场合: a. 远程代理, 为一个对象在不同的地址空间提供局部代理,隐藏一个对象存在于不同地址空间的事实.如.net中WebS ...

  7. 23种设计模式--代理模式-Proxy

    一.代理模式的介绍       代理模式我们脑袋里出现第一个词语就是代购,其实就是这样通过一个中间层这个中间成是属于什么都干什么都买得,俗称"百晓生",在平时得开发中我们经常会听到 ...

  8. 设计模式 -- 代理模式 (Proxy Pattern)

    定义: 为其他对象提供一种代理以控制对这个对象的访问: 角色: 1,抽象主题类,(接口或者抽象类),抽象真实主题和代理的共有方法(如下Subject类): 2,具体实现的主题类,继承或者实现抽象主题类 ...

  9. 深入浅出设计模式——代理模式(Proxy Pattern)

    模式动机在某些情况下,一个客户不想或者不能直接引用一个对象,此时可以通过一个称之为“代理”的第三者来实现间接引用.代理对象可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象去掉客户不能看到 ...

  10. 【转】设计模式(十一)代理模式Proxy(结构型)

    设计模式(十一)代理模式Proxy(结构型) 1.概述 因为某个对象消耗太多资源,而且你的代码并不是每个逻辑路径都需要此对象, 你曾有过延迟创建对象的想法吗 ( if和else就是不同的两条逻辑路径) ...

随机推荐

  1. Java如何连接到MySQL数据库的

    下载:mysql-connector-java-5.1.38.tar.gz http://dev.mysql.com/downloads/connector/j/ tar zxvf mysql-con ...

  2. 【POJ2185】【KMP + HASH】Milking Grid

    Description Every morning when they are milked, the Farmer John's cows form a rectangular grid that ...

  3. Servlet监听器类型

    ------------------------serlvet对象监听器------------------------------------------- request监听器(ServletRe ...

  4. nodejs版本控制

    本方法基于https://segmentfault.com/a/1190000004855835修改 配置: 使用的nvmw的git 地址https://github.com/hakobera/nvm ...

  5. shell脚本获取mysql插入数据自增长id的值

    shell脚本获取mysql插入数据自增长id的值 在shell脚本中我们可以通过last_insert_id()获取id值,但是,需要注意的是,该函数必须在执行插入操作的sql语句之后,立即调用,否 ...

  6. wordpress 更改 "Home"为"首页"

    要怎麼更改wordpress的 menu上 那一直顯示著"首頁"的頁籤呢這問題我實在是找好久終於給我找到 在 wp-includes 的 post-template.php 這檔案 ...

  7. Ubuntu 字体安装

    命令安装:   以微软雅黑字体为例(其他的宋体.黑体等点阵字体都一样的),我们的雅黑字体文件是:Yahei.ttf(放在自己的主目录下)(在widows目录的Fonts目录下找需要的字体)由于我是双系 ...

  8. 关于在DEDECMS当中模板文件不存在的解决方案

    大家可能在生成文档的时候遇到过,模板文件不存在,无法解析  这个问题,其实这个遇到这个问题的大多数人应该是修改了默认模板的名称才导致这样的问题,如果你避免这种问题大家在一开始对模板进行命名的时候就要写 ...

  9. for循环,列表和格式化输出

    一:for 循环 1.          简单的说如果让你输出1到100之间的整数,用while该怎么实现呢? i= : print(i) i+= 看着是不是只有4行,但是有没有更加简单的办法,不妨我 ...

  10. python 中文乱码解决

    # -*- coding:utf-8 -*- import sys reload(sys) sys.setdefaultencoding('utf8') physicsPath = u"D: ...