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

 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. (转载)JavaScript中的日期格式转换

    (转载)http://www.php100.com/html/webkaifa/javascript/2008/1229/1618.html 今天做页面需要把JS里面的Date规范输出为“YYYY-M ...

  2. U盘安装 OSX

    首先,刚从app store下载完的OS X Lion会放在屏幕下方的Dock中. 用鼠标将Mac OS X Lion 10.7文件从Dock中拖放到桌面. 右键单击Mac OS X Lion 10. ...

  3. [Linux&Vim]输入输出流

    流不尽,东逝水 关于流,以前大致知道有这样三个概念:标准输入流(stdin).标准输出流(stdout)和错误输出流(stderr). 什么是流,做什么用的,怎么个用法? 基本概念下面这篇文章讲得已经 ...

  4. octopress的一些总结

    1.编辑_config.yml 的description时,不能使用tab键 2.修改主题‘MediumFox’  description 和 文章展示的宽度,修改文件home_landing_row ...

  5. windows下安装python的C扩展编译环境(解决“Unable to find vcvarsall.bat”)

    个人文章除注明转载外,均为个人原创或者翻译. 个人文章欢迎各种形式的转载,但请18岁以上的转载者注明文章出处,尊重我的劳动,也尊重你的智商: 本文链接:http://www.cnblogs.com/f ...

  6. Django-RQ首页、文档和下载 - Django 和 RQ 集成 - 开源中国社区

    Django-RQ首页.文档和下载 - Django 和 RQ 集成 - 开源中国社区 Django-RQ 项目实现了 Django 框架和 RQ 消息队列之间的集成.

  7. Debug调试

    1.F5单步调试进入函数内部 2.F6单步调试进行下一步 3.F7由函数内部返回到调用用处 4.F8一直执行到下一个断点

  8. linux —— 编译linux内核

    目录:     0.测试环境 1.获得最新内核源代码  2.编译源代码 3.运行新的内核 0.测试环境: 我的系统 : ubuntu 16.04 LTS (内核版本:4.4.0-36-generic ...

  9. UVa11925 Generating Premutations

    留坑(p.254) #include<cstdio> #include<cstring> #include<cstdlib> #include<algorit ...

  10. 用Excel完成专业化数据统计、分析工作

    使用Excel可以完成很多专业软件才能完成的数据统计.分析工作,比如:直方图.相关系数.协方差.各种概率分布.抽样与动态模拟.总体均值判断,均值推断.线性.非线性回归.多元回归分析.时间序列等.本专题 ...