示例为最经典的西门庆示例

1,什么是代理模式?

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

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

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

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

抽象角色:声明真实对象和代理对象的共同接口;
代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。

4,应用场景举例:

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

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

先定义一种女人

Java代码  
  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. }
package com.yangguangfu.proxy;
/*** * @author 阿福(trygf521@126.com)<br>*定义一种类型的女人,王婆和潘金莲都属于这个类型的女人*/
public interface KindWoman {//这种女人能做什么事情呢?public void makeEyesWithMan();//抛媚眼public void happyWithMan();//和男人那个....}

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

Java代码  
  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. }
package com.yangguangfu.proxy;
/*** * @author 阿福(trygf521@126.com)<br>*定义一个潘金莲是什么样的人*/
public class PanJinLian  implements KindWoman{@Overridepublic void happyWithMan() {System.out.println("潘金莲和男人在做那个...");}@Overridepublic void makeEyesWithMan() {System.out.println("潘金莲抛媚眼...");}}

再定义个丑陋的王婆

Java代码  
  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. }
package com.yangguangfu.proxy;
/*** * @author 阿福(trygf521@126.com)<br>*王婆这个人老聪明了,她太老了,是个男人都看不上她,*但是她有智慧经验呀,他作为一类女人的代理!*/
public class WangPo implements KindWoman {private KindWoman kindWoman;public WangPo(){//默认的话是潘金莲的代理this.kindWoman = new PanJinLian();}//她可以是KindWomam的任何一个女人的代理,只要你是这一类型public WangPo(KindWoman kindWoman){this.kindWoman = kindWoman;}@Overridepublic void happyWithMan() {//自己老了,干不了了,但可以叫年轻的代替。this.kindWoman.happyWithMan();}@Overridepublic void makeEyesWithMan() {//王婆年纪大了,谁看她抛媚眼啊this.kindWoman.makeEyesWithMan();}}

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

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

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

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

Java代码  
  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. }
package com.yangguangfu.proxy;
/*** * @author 阿福(trygf521@126.com)<br>*定义一个贾氏是什么样的人*/
public class JiaShi implements KindWoman {@Overridepublic void happyWithMan() {System.out.println("贾氏和男人在做那个...");}@Overridepublic void makeEyesWithMan() {System.out.println("贾氏抛媚眼...");}}

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

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

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

转载于:https://www.cnblogs.com/hanhuibing/articles/4090574.html

Java设计模式之代理模式相关推荐

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

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

  2. Java设计模式(三) -- 代理模式

    代理是一种设计模式,即通过代理对象访问目标对象,这样可以在目标对象实现的基础上,增强额外的功能,即扩展目标类的功能. 通常编程中存在一种思想,即不要随意修改别人的代码或者方法,所以代理就可以在不修改目 ...

  3. java设计模式之代理模式详解

    代理模式在Java中十分常见,有如Spring实现AOP而使用动态代理,更有RPC实现中使用的调用端调用的代理服务.代理模型除了是一种设计模式之外,它更是一种思维,所以探讨并深入理解这种模型是非常有必 ...

  4. java设计模式之代理模式多种写法(三)

    背景 代理模式属于结构型模式,代理模式也是我们开发中常用的设计模式之一,本次讲解以下几种代理模式的写法,希望可以帮助大家更快的理解代理模式,包括自己写一个动态代理的方法. 静态代理 package c ...

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

    参考http://blog.csdn.net/jianghuxiaoxiami/article/details/3403924 1.代理模式 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的 ...

  6. Java设计模式-Proxy代理模式

    问题分析: 什么是代理模式呢?其实我们在生活中并不少见.对于程序员来说最常接触的莫过于代理上网了,连接大力服务器地址,就可以访问网络. 还有每天吃饭赶进度是常事,叫公司的同事帮忙带饭也是一种代理:如果 ...

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

    1.静态代理 被代理对象和代理对象都要实现相同的接口或者继承相同的父类. 不需要修改被代理对象就可以实现对功能的扩展,缺点是如果接口发生变化,比如增加新方法,被代理对象和代理对象都需要维护. 1)首先 ...

  8. java设计模式之——代理模式

    1,什么是代理模式? 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问. 2,策略模式有什么好处? 在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象 ...

  9. Java设计模式-之代理模式(动态代理)

    一.简介 1.什么叫代理模式:        简而言之就是:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起 ...

最新文章

  1. Android getWindow().setFlags方法
  2. Boost:使用/type <>语法测试功能对象
  3. 【移植Linux 3.4.2内核第二步】之修改系统分区
  4. 8.在idea中配置maven
  5. Android多线程之IntentService源码解析
  6. filter 函数 map 函数 reduce函数 介绍
  7. C++程序设计方法3:移动构造函数
  8. js读取http chunk流_极简 Node.js入门 教程双工流
  9. php和asp渲染页面,Vue.js与 ASP.NET Core 服务端渲染功能
  10. Codeforces Edu Round 64 (Rated for Div. 2)
  11. Ubuntu18.04之boost警告报错
  12. python是否存在键_检查给定的键在Python的字典中是否已经存在
  13. 上班按小时的怎么记,小时工计时怎么用便签记上个月的工时
  14. css-图片模糊处理
  15. 【人脸识别】arcface-pytorch代码解析
  16. 《HarmonyOS开发 - 小凌派-RK2206开发笔记》第1章 开发环境搭建
  17. 电脑局域网所有IP及对应MAC地址查询
  18. CSMA/CD总线以太网和交换式以太网
  19. 别了甲骨文,别了拉里·埃里森!
  20. 2020AI顶会的腾讯论文解读 | 多模态学习、视频内容理解、对抗攻击与对抗防御等「AI核心算法」

热门文章

  1. 使用ScriptableObject代替部分配置表的坑点
  2. 为襄阳租车 阴面立法“补缺”
  3. mysql停掉正在运行的存储过程
  4. 基于TextField实现通用搜索组件
  5. 「目前全网唯一2万字长文」从JS上下文到Chromium源码的极限拉扯!!兄弟姐妹们接好了!!...
  6. java设计模式总结之六大设计原则(有图有例子)
  7. [译] 改善 DaVinci Resolve 性能的 5 个秘诀
  8. APP产品线上埋点方案
  9. Qt-QCustomPlot
  10. java线程之可重入锁