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. CentoS6.x网络配置

    一.配置文件 在CentoS系统里面,跟网络有关的主要配置文件有    1./etc/host.conf # 配置域名服务客户端的控制文件 2./etc/hosts # 配置主机名映射为IP的功能 3 ...

  2. Sumsets(3sum问题,枚举d,c二分a+b)

    Sumsets Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9997   Accepted: 2736 Descripti ...

  3. Redis 实践笔记

    本文来自:http://www.cnblogs.com/me-sa/archive/2012/03/13/redis-in-action.html 最近在项目中实践了一下Redis,过程中遇到并解决了 ...

  4. 【dfs or 最短路】【HDU1224】【Free DIY Tour】

    路径只能由小序号到大序号..(起点可以视为最小的序号和最大的序号) 问怎么走 happy值最大.. DFS N=100 且只能小序号到大序号 显然dfs可以过.. 但是存路径的时候sb了.....应该 ...

  5. beforefieldinit释义(3)

    1.看下面的例子: public static class MyClass<T> { public static readonly DateTime Time = GetNow(); pr ...

  6. 端口扫描器之java实现

    端口扫描器之java实现   import java.net.*;import java.io.*;import java.awt.*;import java.awt.event.*;import j ...

  7. Three.js学习笔记 – “我和小伙伴都惊呆了”的特效和Three.js初探

    什么是Three.js three.js是JavaScript编写的WebGL第三方库.提供了非常多的3D显示功能.Three.js 是一款运行在浏览器中的 3D 引擎,你可以用它创建各种三维场景,包 ...

  8. JS中定义类的方法<转>

    转载地址:http://blog.csdn.net/sdlfx/article/details/1842218 PS(个人理解): 1) 类通过prototype定义的成员(方法或属性),是每个类对象 ...

  9. 老司机带你用vagrant打造一站式python开发测试环境

      前言 作为一个学习和使用Python的老司机,好像应该经常总结一点东西的,让新司机尽快上路,少走弯路,然后大家一起愉快的玩耍. 今天,咱们就使用vagrant配合xshell打造一站式Python ...

  10. Almost Prime

    Description Almost Prime time limit per test: 2 seconds memory limit per test: 256 megabytes input: ...