代理模式我想大家即便不熟悉也都听过吧,从字面意思上看就是替别人干活的,比方代理商。在项目的实际应用中也有非常多地方用到。比方spring通过代理模式生成对象等。

代理模式的书面定义:为其它对象提供一种代理以控制对这个对象的訪问。

在某些情况下,一个对象不适合或者不能直接引用还有一个对象,而代理对象能够在client和目标对象之间起到中介的作用。

在《《大话设计模式》》一书中以一个有男朋友的女孩让“小菜”帮忙修电脑的故事展开的,事实上说白了代理就是帮别人干活的,一般老板不出面,都是小弟帮忙做交易。代理模式非常好理解也非常好懂,那就直接来代码吧

1、要追求的姑娘

/*

*
被追求的女孩

*/

publicclass Girl {

private String
name;

public String getName() {

returnname;

}

publicvoid setName(String name) {

this.name = name;

}

}

、真正的追求者

/*

*
真实的追求者

*/

publicclass Pursuit
implements GiveGift {

//礼物当然送给女孩了

protected Girl
girl;

public
Pursuit(Girl girl){

this.girl = girl;

}

publicvoid giftChocolate() {

//
TODO Auto-generated method stub

System.out.println("送巧克力给"+girl.getName());

}

publicvoid giftFlowers() {

//
TODO Auto-generated method stub

System.out.println("送花给"+girl.getName());

}

}

、代理中间人

/*

*
代理类

*/

publicclass Proxy
implements GiveGift {

protected Pursuit
pursuit;

//毕竟是代理,真正的还是追求者与女孩的联系

public Proxy(Girl girl){

pursuit =
new Pursuit(girl);

}

publicvoid giftChocolate() {

//
TODO Auto-generated method stub

pursuit.giftChocolate();

}

//花事实上是追求者的

publicvoid giftFlowers() {

//
TODO Auto-generated method stub

pursuit.giftFlowers();

}

}

4、client

publicclass ProxyClient {

/**

* @param args

*/

publicstaticvoid main(String[] args) {

//
TODO Auto-generated method stub

Girlgirl = new Girl();

girl.setName("妹妹");

//真正操作的是代理

Proxyproxy =  new Proxy(girl);

proxy.giftChocolate();

proxy.giftFlowers();

}

}

代理模式都在什么场合应用呢?(摘自网络)

1) 远程代理(Remote  Proxy)为一个位于不同的地址空间的对象提供一个本地的代理对象。这个不同的地址空间能够是在同一台主机中,也但是在还有一台主机中,远程代理又叫做大使(Ambassador)

2) 虚拟代理(Virtual Proxy)依据须要创建开销非常大的对象。假设须要创建一个资源消耗较大的对象。先创建一个消耗相对较小的对象来表示,真实对象仅仅在须要时才会被真正创建。 

3) 保护代理(Protection Proxy)控制对原始对象的訪问。保护代理用于对象应该有不同的訪问权限的时候。

4) 智能指引(Smart Reference)代替了简单的指针,它在訪问对象时运行一些附加操作。

5) Copy-on-Write代理:它是虚拟代理的一种,把复制(克隆)操作延迟到仅仅有在client真正须要时才运行。一般来说,对象的深克隆是一个开销较大的操作,Copy-on-Write代理能够让这个操作延迟。仅仅有对象被用到的时候才被克隆。

总结:本章代理模式非常好理解。代码也非常easy。在这里说一下它的有点吧。职责清晰,真实的角色就是实现实际的业务逻辑。不用关心其它非本职责的事务,通过后期的代理完毕一件完毕事务,附带的结果就是编程简洁清晰。

代理对象能够在client和目标对象之间起到中介的作用,这样起到了的作用和保护了目标对象的作用。

还有就是高扩展性

<四>读<<大话设计模式>>之代理模式的更多相关文章

  1. <二>读<<大话设计模式>>之策略模式

    又和大家见面了.可以坚持写出第二篇文章真不错,好好加油. <<大话设计模式>>解说策略模式是以商场收银软件程序开头的,那么问题来了.哪家商场收银软件强,开玩笑了. 读过上篇文章 ...

  2. &lt;十二&gt;读&lt;&lt;大话设计模式&gt;&gt;之状态模式

    对于状态模式,<<大话设计模式>>是以人从上班到下班到加班的状态来展开讲述的.状态模式事实上就是某一个对象在某个过程或者时间的一个状态记录,可是这个状态的顺序不能发生变化.在程 ...

  3. 《大话设计模式》c++实现 代理模式

    代理模式 在代理模式(Proxy Pattern)中,一个类代表另一个类的功能.这种类型的设计模式属于结构型模式. 在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口. 介绍 意图:为其 ...

  4. &lt;五&gt;读《《大话设计模式》》之工厂模式

    怎么又是工厂模式呢?上次不是讲过简单工厂模式吗?不错.此工厂模式非彼工厂模式. 工厂模式:定义一个用于创建对象的接口.让子类决定实例化那一个类,工厂方法是一个类的实例化延迟到其子类. 还是以代码来进行 ...

  5. 大话设计模式C++版——抽象工厂模式

    前面说过,简单工厂模式是最基础的一种设计模式,那以工厂命名的设计模式就是23种设计模式中最多的一种,他们一脉相承,一步一步进化而来,这里就是其中的最后一种——抽象工厂模式(Abstract Facto ...

  6. 大话设计模式C++版——工厂方法模式

    工厂方法模式是以简单工厂模式为基础的,如果未了解简单工厂模式的同学可先浏览<大话设计模式C++版——简单工厂模式>.在简单工厂模式中,提到过简单工厂模式的缺陷,即违背了开发—封闭原则,其主 ...

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

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

  8. 设计模式之jdk动态代理模式、责任链模式-java实现

    设计模式之JDK动态代理模式.责任链模式 需求场景 当我们的代码中的类随着业务量的增大而不断增大仿佛没有尽头时,我们可以考虑使用动态代理设计模式,代理类的代码量被固定下来,不会随着业务量的增大而增大. ...

  9. Java设计模式(10)代理模式(Proxy模式)

    理解并使用设计模式,能够培养我们良好的面向对象编程习惯,同时在实际应用中,可以如鱼得水,享受游刃有余的乐趣. Proxy是比较有用途的一种模式,而且变种较多,应用场合覆盖从小结构到整个系统的大结构,P ...

随机推荐

  1. 开放API端口SIGN算法详细设计

    开放API端口SIGN算法详细设计 前言 在app开放接口api的设计中,避免不了的就是安全性问题,因为大多数接口涉及到用户的个人信息以及一些敏感的数据,所以对这些接口需要进行身份的认证,那么这就需要 ...

  2. PDCurses 笔记(一)

    之前没有接触过curse和ncurse,平时用的也都是windows系统,所以对PDCurses也挺感兴趣的.网上关于PDCurses的内容也不是很多,但是感觉上它的函数应该都是和其他操作系统里函数都 ...

  3. 【cocos2d-js官方文档】三、Bake功能使用说明

    设计意图 在游戏开发的过程中,经常会遇到作为UI或者不怎么修改的背景的层(Layer), 这些层内容并不怎么变动. 而在游戏的渲染过程中,这些层往往又会消耗大量的渲染时间,特别是比较复杂的UI界面,比 ...

  4. jquery ajax事件执行顺序

    jquery中各个事件执行顺序如下: 1.ajaxStart(全局事件) 2.beforeSend 3.ajaxSend(全局事件) 4.success 5.ajaxSuccess(全局事件) 6.e ...

  5. Bellman - Ford 算法解决最短路径问题

    Bellman - Ford 算法: 一:基本算法 对于单源最短路径问题,上一篇文章中介绍了 Dijkstra 算法,但是由于 Dijkstra 算法局限于解决非负权的最短路径问题,对于带负权的图就力 ...

  6. KMP+差分 文章过滤器 (filter)

    Description 给定一些短串,要求你在一个长串中,将这些短串部分变为\(*\) Input 第一行包括一个整数\(n\),表示短串的数量. 接下来的\(n\)行,为\(n\)个短串. 最后一行 ...

  7. 灯泡游戏 (Kruskal)(并查集)

    灯泡游戏 时间限制: 1 Sec  内存限制: 64 MB提交: 9  解决: 4[提交][状态][讨论版] 题目描述 有 一个n行m列的矩阵,左上角坐标是(0,0),右下角坐标是(n-1,m-1). ...

  8. [Contest20180313]灵大会议

    为了方便才用lct,没想到最后要加读入优化才能过... 有一个结论就是在一条链上,如果能找到一个点使得这个点划分链左右两边的树节点权值和最相近,那么这个点就是答案 用lct维护,每个splay节点存树 ...

  9. 【数论】【筛法求素数】【欧拉函数】bzoj2818 Gcd

    gcd(x,y)(1<=x,y<=n)为素数(暂且把(x,y)和(y,x)算一种) 的个数 <=> gcd(x/k,y/k)=1,k是x的质因数 的个数 <=> Σ ...

  10. 使用MultipleInputs和MultipleOutputs

    还是计算矩阵的乘积,待计算的表达式如下: S=F*[B+mu(u+s+b+d)] 其中,矩阵B.u.s.d分别存放在名称对应的SequenceFile文件中. 1)我们想分别读取这些文件(放在不同的文 ...