什么是代理模式呢?我很忙,忙的没空理你,那你要找我呢就先找我的代理人吧,那代理人总要知道被代理人能做哪些事情不能做哪些事情吧,那就是两个人具备同一个接口,代理人虽然不能干活,但是被代理的人能干活呀。
  比如西门庆找潘金莲,那潘金莲不好意思答复呀,咋办,找那个王婆做代理,表现在程序上这样的:
  先定义一种类型的女人:

 package com.iadmob.proxy;

 /**
* @author http://www.cnblogs.com/initial-road/
* 定义一种类型的女人,王婆和潘金莲都属于这个类型的女人
*/ public interface KindWomen {   //这种类型的女人能做什么事情呢?
  public void makeEyesWithMan(); //抛媚眼   public void happyWithMan(); //happy } 一种类型嘛,那肯定是接口,然后定义潘金莲: package com.iadmob.proxy; /**
* @author http://www.cnblogs.com/initial-road/
* 定一个潘金莲是什么样的人
*/
public class PanJinLian implements KindWomen{   @Override
  public void happyWithMan() {
    System.out.println("潘金莲在和男人...");
  }   @Override
  public void makeEyesWithMan() {
    System.out.println("潘金莲抛媚眼");
  } } 再定一个丑陋的王婆: package com.iadmob.proxy; /**
* @author http://www.cnblogs.com/initial-road/
* 王婆这个人老聪明了,她太老了,是个男人都看不上,
* 但是她有智慧有经验,她作为一类女人的代理
*/
public class WangPo implements KindWomen{
  private KindWomen kindWomen;   public WangPo(){ //默认的话,是潘金莲的代理
    this.kindWomen = new PanJinLian();
  }   //她可以是KindWomen的任何一个女人的代理,只要你是这一类型
  public WangPo(KindWomen kindWomen){
    this.kindWomen = kindWomen;
  }   @Override
  public void happyWithMan() {
    this.kindWomen.happyWithMan(); //自己老了,干不了,可以让年轻的代替
  }   @Override
  public void makeEyesWithMan() {
    this.kindWomen.makeEyesWithMan();
  } } 两个女主角都上场了,男主角也该出现了: package com.iadmob.proxy; /**
* @author http://www.cnblogs.com/initial-road/
* 定义一个西门庆,这人色中饿鬼
*/
public class XiMenQing {
  /**
  * 水浒里是这样写的:西门庆被潘金莲用竹竿敲了一下难道,痴迷了
  * 被王婆看到了,就开始撮合两人好事,王婆作为潘金莲的代理人
  * 收了不少好处费,那我们假设一下
  * 如果没有王婆在中间牵线,这两个不要脸的能成吗?难说的很!
  */
  public static void main(String[] args) {
    //把王婆叫出来
    WangPo wangPo = new WangPo();
    //然后西门庆就说,我要和潘金莲happy,然后王婆就安排了西门庆丢筷子的哪出戏:
    wangPo.makeEyesWithMan(); //看到没,虽然表面上王婆在做,实际上爽的是潘金莲
    wangPo.happyWithMan();
  }
}

  这就是活生生的一个例子,通过代理人实现了某种目的,如果真去掉王婆这个中间环节,直接是西门庆和潘金莲勾搭,估计很难成就武松杀嫂事件。
那我们再考虑一下,水浒里还有没有这类型的女人?有,卢俊义的老婆贾氏(就是和那个固管家苟且的那个),这名字起的:“贾氏”,那我们也让王婆做她的代理:
把贾氏素描出来:

 package com.iadmob.proxy;

 public class JiaShi implements KindWomen{

   @Override
  public void happyWithMan() {
    System.out.println("贾氏正在Happy中......");
  }   @Override
  public void makeEyesWithMan() {
    System.out.println("贾氏抛媚眼");
  } }

西门庆勾贾氏:

 package com.iadmob.proxy;

 /**
* @author http://www.cnblogs.com/initial-road/
* 定义一个西门庆,这人色中饿鬼
*/
public class XiMenQing {
  /**
  * 水浒里是这样写的:西门庆被潘金莲用竹竿敲了一下难道,痴迷了
  * 被王婆看到了,就开始撮合两人好事,王婆作为潘金莲的代理人
  * 收了不少好处费,那我们假设一下
  * 如果没有王婆在中间牵线,这两个不要脸的能成吗?难说的很!
  */
  public static void main(String[] args) {     //改编一下历史,贾氏被西门庆勾走:
    JiaShi jiaShi = new JiaShi();
    WangPo wangPo = new WangPo(jiaShi);  //让王婆作为贾氏的代理人
    wangPo.makeEyesWithMan();
    wangPo.happyWithMan();
  }
}

  说完这个故事,总结一下,代理模式主要使用了Java的多态,干活的是被代理类,代理类主要是接活,你让我干活,好,我交给幕后的类去干,你满意就成,那怎么知道被代理类能不能干呢?同根就成,大家知根知底,你能做啥,我能做啥都清除的很,同一个接口呗。

24种设计模式--代理模式【Proxy Pattern】的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. 24种设计模式-策略模式(Strategy Pattern)

    一.优点: 1. 策略模式提供了管理相关的算法族的办法.策略类的等级结构定义了一个算法或行为族.恰当使用继承可以把公共的代码转移到父类里面,从而避免重复的代码. 2. 策略模式提供了可以替换继承关系的 ...

  7. 二十四种设计模式:代理模式(Proxy Pattern)

    代理模式(Proxy Pattern) 介绍为其他对象提供一个代理以控制对这个对象的访问. 示例有一个Message实体类,某对象对它的操作有Insert()和Get()方法,用一个代理来控制对这个对 ...

  8. 乐在其中设计模式(C#) - 代理模式(Proxy Pattern)

    原文:乐在其中设计模式(C#) - 代理模式(Proxy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 代理模式(Proxy Pattern) 作者:webabcd 介绍 为 ...

  9. 设计模式系列之代理模式(Proxy Pattern)——对象的间接访问

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

随机推荐

  1. HDOJ/HDU 1297 Children’s Queue(推导~大数)

    Problem Description There are many students in PHT School. One day, the headmaster whose name is Pig ...

  2. 用Objective-C的Category特性添加类的属性

    http://www.cnblogs.com/wupher/archive/2013/01/05/2845338.html Category是Objective-C中常用的语法特性,通过它可以很方便的 ...

  3. Oracle中trunc函数、round 函数、ceil函数和floor函数的使用

    Oracle中trunc函数.round 函数.ceil函数和floor函数的使用 1.1trunc函数处理数字 trunc函数返回处理后的数值,其工作机制与ROUND函数极为类似,只是该函数不对指定 ...

  4. C# 程序集 与 反射

    程序集 对于C#程序员来说一定不陌生,不就是VS生成的那些exe,dll么.是的,程序集(.net中exe与dll的区别就是exe有程序接入口,即Main函数)就是.net框架下,可以被CLR加载并运 ...

  5. js判断是否为手机浏览器

    JS判断手机浏览器 判断原理: JavaScript是前端开发的主要语言,我们可以通过 编写JavaScript程序来判断浏览器的类型及版本.JavaScript判断浏览器类型一般有两种办法,一种是根 ...

  6. 【转】eclipse使用git提交到osc

    转自:http://my.oschina.net/gaowm/blog/271623 目录[-] 一.Git下载 二.Git安装 三.设置用户名和密码 四.准备代码库 五.创建本地仓库 六.eclip ...

  7. (转)LINUX的端口和服务

    一.端口和服务的关系 端口号与相应服务的对应关系存放在/etc/services文件中,这个文件中可以找到大部分端口.使用netstat命令显示的服务名称也是从这个文件中找的.有人说将这个文件中的相应 ...

  8. SQL server数据库中的DateTime类型出现的问题

    我们知道这个SQL server数据库中的DateTime类型是数据库应用开发中经经常使用到的一种数据类型.而C#语言中也有DateTime类型,尽管二者都是用来描写叙述时间的,可是它们的默认值是不同 ...

  9. PHP运行出现Notice : Use of undefined constant 的解决方法【已测】

    关闭 PHP 提示的方法 搜索php.ini:error_reporting = E_ALL改为:error_reporting = E_ALL & ~E_NOTICE还有个不是办法的办法就是 ...

  10. uva 11440 - Help Tomisu(欧拉功能)

    题目链接:uva 11440 - Help Tomisu 题目大意:给定n和m,求从2~n.中的数x.要求x的质因子均大于m.问说x有多少个.答案模上1e9+7. 解题思路: (1)n!=k∗m!(n ...