1,什么是代理模式?

代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。

2,策略模式有什么好处?

在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

3,代理模式一般涉及到的角色有:

抽象角色:声明真实对象和代理对象的共同接口;

代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。

真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。

4,应用场景举例:

比如西门庆找潘金莲,那潘金莲不好意思答复呀,咋办,找那个王婆做代理,表现在程序上时是这样的体现的

先说说这个场景中的要素:一种类型的女人,潘金莲,王婆,西门庆,后来扩展的贾氏也和西门庆勾上了,我们是假设的,然后西门庆找潘金莲happy,但潘金莲不好意思直接,就找个王婆代理呗。我们看看具体代码。

先定义一种女人

  1. package com.yangguangfu.proxy;
  2. /**
  3. *
  4. * @author 阿福(trygf521@126.com)<br>
  5. *定义一种类型的女人,王婆和潘金莲都属于这个类型的女人
  6. */
  7. public interface KindWoman {
  8. //这种女人能做什么事情呢?
  9. public void makeEyesWithMan();//抛媚眼
  10. public void happyWithMan();//和男人那个....
  11. }

一种类型嘛,那肯定是接口,定义个潘金莲

  1. package com.yangguangfu.proxy;
  2. /**
  3. *
  4. * @author 阿福(trygf521@126.com)<br>
  5. *定义一个潘金莲是什么样的人
  6. */
  7. public class PanJinLian  implements KindWoman{
  8. @Override
  9. public void happyWithMan() {
  10. System.out.println("潘金莲和男人在做那个...");
  11. }
  12. @Override
  13. public void makeEyesWithMan() {
  14. System.out.println("潘金莲抛媚眼...");
  15. }
  16. }

再定义个丑陋的王婆

  1. package com.yangguangfu.proxy;
  2. /**
  3. *
  4. * @author 阿福(trygf521@126.com)<br>
  5. *王婆这个人老聪明了,她太老了,是个男人都看不上她,
  6. *但是她有智慧经验呀,他作为一类女人的代理!
  7. */
  8. public class WangPo implements KindWoman {
  9. private KindWoman kindWoman;
  10. public WangPo(){
  11. //默认的话是潘金莲的代理
  12. this.kindWoman = new PanJinLian();
  13. }
  14. //她可以是KindWomam的任何一个女人的代理,只要你是这一类型
  15. public WangPo(KindWoman kindWoman){
  16. this.kindWoman = kindWoman;
  17. }
  18. @Override
  19. public void happyWithMan() {
  20. //自己老了,干不了了,但可以叫年轻的代替。
  21. this.kindWoman.happyWithMan();
  22. }
  23. @Override
  24. public void makeEyesWithMan() {
  25. //王婆年纪大了,谁看她抛媚眼啊
  26. this.kindWoman.makeEyesWithMan();
  27. }
  28. }

两个女主角都上场了,该男主角了,定义个西门庆

  1. package com.yangguangfu.proxy;
  2. /**
  3. *
  4. * @author 阿福(trygf521@126.com)<br>
  5. *水浒传是这样写的:西门庆被潘金莲用竹竿敲了一下,西门庆看痴迷了,被王婆看到了,就开始撮合两人好事,王婆作为潘金莲的代理人收了不少好处费,那我们假设一下:
  6. *如果没有王婆在中间牵线,这两个不要脸的能成事吗?难说得很!
  7. */
  8. public class XiMenQiang {
  9. /**
  10. * @param args
  11. */
  12. public static void main(String[] args) {
  13. WangPo wangPo;
  14. //把王婆叫出来
  15. wangPo = new WangPo();
  16. //然后西门庆说,我要和潘金莲Happy,然后王婆就安排了西门庆丢筷子哪出戏:
  17. wangPo.makeEyesWithMan();
  18. //看到没有表面是王婆在做,其实爽的是潘金莲
  19. wangPo.happyWithMan();
  20. }
  21. }

那这就是活生生的一个例子,通过代理人实现了某种目的,如果真去了王婆这个中间环节,直接西门庆和潘金莲勾搭,估计很难成就武松杀嫂事件。

那我们再考虑一下,水浒里面还有没有这类型的女人?有,卢俊义的老婆贾氏(就是和那个管家苟合的那个),这个名字起的:“贾氏”,那我们也让王婆做她的代理:

  1. package com.yangguangfu.proxy;
  2. /**
  3. *
  4. * @author 阿福(trygf521@126.com)<br>
  5. *定义一个贾氏是什么样的人
  6. */
  7. public class JiaShi implements KindWoman {
  8. @Override
  9. public void happyWithMan() {
  10. System.out.println("贾氏和男人在做那个...");
  11. }
  12. @Override
  13. public void makeEyesWithMan() {
  14. System.out.println("贾氏抛媚眼...");
  15. }
  16. }

西门庆勾潘金莲又勾引贾氏

  1. package com.yangguangfu.proxy;
  2. /**
  3. *
  4. * @author 阿福(trygf521@126.com)<br>
  5. *水浒传是这样写的:西门庆被潘金莲用竹竿敲了一下,西门庆看痴迷了,被王婆看到了,就开始撮合两人好事,王婆作为潘金莲的代理人收了不少好处费,那我们假设一下:
  6. *如果没有王婆在中间牵线,这两个不要脸的能成事吗?难说得很!
  7. */
  8. public class XiMenQiang {
  9. /**
  10. * @param args
  11. */
  12. public static void main(String[] args) {
  13. WangPo wangPo;
  14. //把王婆叫出来
  15. wangPo = new WangPo();
  16. //然后西门庆说,我要和潘金莲Happy,然后王婆就安排了西门庆丢筷子哪出戏:
  17. wangPo.makeEyesWithMan();
  18. //看到没有表面是王婆在做,其实爽的是潘金莲
  19. wangPo.happyWithMan();
  20. //西门庆勾引贾氏
  21. JiaShi jiaShi = new JiaShi();
  22. wangPo = new WangPo(jiaShi);
  23. wangPo.makeEyesWithMan();
  24. wangPo.happyWithMan();
  25. }
  26. }

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

java设计模式之——代理模式的更多相关文章

  1. Java设计模式之代理模式(静态代理和JDK、CGLib动态代理)以及应用场景

    我做了个例子 ,需要可以下载源码:代理模式 1.前言: Spring 的AOP 面向切面编程,是通过动态代理实现的, 由两部分组成:(a) 如果有接口的话 通过 JDK 接口级别的代理 (b) 如果没 ...

  2. java设计模式6——代理模式

    java设计模式6--代理模式 1.代理模式介绍: 1.1.为什么要学习代理模式?因为这就是Spring Aop的底层!(SpringAop 和 SpringMvc) 1.2.代理模式的分类: 静态代 ...

  3. 夜话JAVA设计模式之代理模式(Proxy)

    代理模式定义:为另一个对象提供一个替身或者占位符以控制对这个对象的访问.---<Head First 设计模式> 代理模式换句话说就是给某一个对象创建一个代理对象,由这个代理对象控制对原对 ...

  4. Java设计模式:代理模式(转)

    代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.这里使用到编程中的一 ...

  5. Java 设计模式_代理模式(2016-08-19)

    概念: 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 就是一个人或者机构代表另一个人或者机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一 ...

  6. JAVA设计模式:代理模式&& 装饰模式区别

    在前面学习了代理模式和装饰模式后,发现对两者之间有时候会混淆,因此对两者进行了区别和理解: 装饰模式你可以这样理解,就像糖一样,卖的时候商家大多要在外面包一层糖纸,其实原本还是糖. public in ...

  7. Java设计模式:代理模式(二)

    承接上文 三.计数代理 计数代理的应用场景是:当客户程序需要在调用服务提供者对象的方法之前或之后执行日志或者计数等额外功能时,就可以用到技术代理模式.计数代理模式并不是把额外操作的代码直接添加到原服务 ...

  8. java设计模式之代理模式 ,以及和java 回调机制的区别

    java 代理模式就是: 将自己要做的事交给别人去做(这个别人就是代理者,自己就是被代理者),为什么自己能做的要交给别人去做了?假如一个小学生小明,现在要写作业,但是又想玩游戏,他更想玩游戏,并且不想 ...

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

    前言: 最近在研究Retrofit开源框架的时候,其主要核心代码是通过注解标示参数,动态代理模式实现具体接口,反射机制进行参数解析,最终实现发送请求.其实之前在学习Xutils源码的时候,Xutils ...

  10. Java设计模式 之 代理模式

    所谓的代理模式就是为其它类或对象提供一个代理以控制对这个对象的访问.那么常见的代理有远程代理,虚拟代理,保护代理,智能代理. 1. 远程代理:为一个不同地址空间的对象提供一个本地代理对象. 2. 虚拟 ...

随机推荐

  1. 【Leetcode】寻找数串中连续最大整数和且最大长度的子串

    寻找数串中连续最大整数和且最大长度的子串 输入示例: 1000 -100 200 -200 100 -100 10 90 输出结果: 1100 分析: 分治法解决问题非常方便,依然分为三种情况:a[1 ...

  2. unity3D 锁屏再开程序崩溃

    在Uniyt3d 调用Android Plugin 的时候,会出现锁屏后再开,程序就崩溃的的现象,解决办法就是在 AndroidManifest.xml 加入  android:configChang ...

  3. 关于清晰讲解linux正则表达式的博文分享

    http://www.cnblogs.com/chengmo/archive/2010/10/10/1847287.html  linux shell 正则表达式(BREs,EREs,PREs)差异比 ...

  4. 2.5 Local Methods in High Dimensions

    curse of dimensionality 输入在p维立方体中符合均匀分布,如果需要覆盖比例r的体积,需要每个维度上\(e_p(r)=r^{1/p}\) \(e_{10}(0.01)=0.63,e ...

  5. Atom编辑器快捷键大全

    文件切换 ctrl-shift-s 保存所有打开的文件cmd-shift-o 打开目录cmd-\ 显示或隐藏目录树ctrl-0 焦点移到目录树目录树下,使用a,m,delete来增加,修改和删除cmd ...

  6. 警惕:利用Dropbox链接散播的恶意软件

    趋势科技近期发现好几起利用热门文档代管服务Dropbox的垃圾邮件.邮件的内嵌链接会下载UPATRE恶意软件变种.UPATRE下面载恶意软件而恶名昭彰,当中包含ZBOT恶意软件.CryptoLocke ...

  7. 【字母树+贪心】【HDU3460】【Ancient Printer】

    题目大意: 一个打印机 只有 打印,删除,a-z.操作 给你一堆队名,如何才能操作次数最少输出全部 (字典树节点数-1)*2 输入,删除操作数 字符串数 printf操作数 最长字符串的长度 最后一个 ...

  8. CXF interceptor拦截顺序

    CXF Interceptor中Phase的先后顺序 org.apache.cxf.phase.PhaseManagerImpl中 final void createInPhases() { int  ...

  9. (原) Jquery 判断设备是PC端,还是移动端

    判断设备是PC端,还是移动端 var ua = navigator.userAgent.toLocaleLowerCase(); var pf = navigator.platform.toLocal ...

  10. asp.net 导出excel文件

    之前做过winfrom程序的导出excel文件的功能,感觉非常简单.现在试着做asp.net中导出excel的功能,之前用的是Microsoft.Office.Interop.Excel这个对象来实现 ...