`
yangguangfu
  • 浏览: 1539634 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多

1,什么是代理模式?

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

 

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

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

 

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

 

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

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

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

 

 

4,应用场景举例:

 

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

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

 

先定义一种女人

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

}

 

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

package com.yangguangfu.proxy;
/**
 * 
 * @author 阿福(trygf521@126.com)<br>
 *定义一个潘金莲是什么样的人
 */
public class PanJinLian  implements KindWoman{

	@Override
	public void happyWithMan() {
		System.out.println("潘金莲和男人在做那个...");
		
	}

	@Override
	public void makeEyesWithMan() {
		System.out.println("潘金莲抛媚眼...");
		
	}

}

 

再定义个丑陋的王婆

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;
	}

	@Override
	public void happyWithMan() {
		//自己老了,干不了了,但可以叫年轻的代替。
		this.kindWoman.happyWithMan();
		
	}

	@Override
	public void makeEyesWithMan() {
		//王婆年纪大了,谁看她抛媚眼啊
		this.kindWoman.makeEyesWithMan();
		
	}

}
 

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

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();
		
		

	}

}
 

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

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

package com.yangguangfu.proxy;
/**
 * 
 * @author 阿福(trygf521@126.com)<br>
 *定义一个贾氏是什么样的人
 */
public class JiaShi implements KindWoman {

	@Override
	public void happyWithMan() {
		System.out.println("贾氏和男人在做那个...");
		
	}

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


}
 

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

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的多态,干活的是被代理类,代理类主要是接活,你让我干活,好,我交给幕后的类去干,你满意就成,那怎么知道被代理类能不能干呢?同根就成,大家知根知底,你能做啥,我能做啥都清楚得很,同样一个接口呗。好了不多说了,慢慢体会吧。

 

  • Proxy.zip (8.1 KB)
  • 描述: 源码附上
  • 下载次数: 123
33
5
分享到:
评论
41 楼 hairdryre 2018-04-19  
哈哈哈,太好玩啦!
40 楼 wxyz4214769 2016-09-25  
aclululu 写道
最后一个表示不解,既然已经New JiaShi出来了,为毛在装载给王婆

要注意王婆的构造方法有两个,不带参数的默认要叫潘金莲。带参数的你装载谁就叫谁。
39 楼 wxyz4214769 2016-09-25  
aclululu 写道
最后一个表示不解,既然已经New JiaShi出来了,为毛在装载给王婆

这是要让王婆知道,西门庆要找哪个女人。
38 楼 wxyz4214769 2016-09-25  
写的不错,是男人的话,瞬间就能理解了。
37 楼 aclululu 2016-09-19  
最后一个表示不解,既然已经New JiaShi出来了,为毛在装载给王婆
36 楼 假面派 2016-09-07  
赞一个
35 楼 fym548 2016-08-31  
楼主真是博览群书呀
34 楼 Freshlemonyy 2016-08-23  
佩服!!学习都能这么欢乐,估计这个模式我不会再忘记了
33 楼 wangzhe_real 2016-08-04  
解释起来,王婆就是个老鸨啊!@我的印象笔记
32 楼 qq931145788 2016-07-18  
   好流弊
31 楼 tianshiyeben 2016-07-11  
30 楼 dtl19921202 2016-06-19  
不错。
29 楼 wandeying 2016-06-02  
楼主是有多闷骚啊
28 楼 nishiu 2016-05-10  
这破论坛我就服楼主!
27 楼 ylpstarted 2016-03-05  
楼主这比喻太牛逼
26 楼 cycao 2015-12-17  
服了。。。。
25 楼 QQ1017201780 2015-12-13  
24 楼 tcwyc88 2015-11-03  
硬吹思婷
23 楼 azhqiang 2015-10-28  
mark
22 楼 heshifk 2015-08-12  
以前一直没怎么弄懂代理模式,经过楼主这个生动形象的实例,我好像也懂了点代理模式,仿照楼主的实例,也谢了个USB接口的代理模式

相关推荐

    Java设计模式——代理设计模式(静态代理和动态代理)

    在Java编程中,设计模式是一种解决常见问题的模板或最佳实践,它可以帮助开发者编写更加灵活、可维护和可扩展的代码。代理设计模式是其中的一种,它的主要作用是在不修改原有对象的基础上,为对象添加额外的功能或者...

    设计模式实现——代理模式

    **设计模式实现——代理模式** 在软件工程中,设计模式是一种通用可重用的解决方案,它描述了在特定上下文中经常出现的问题以及该问题的解决方案。代理模式是设计模式的一种,它提供了一种对目标对象的间接访问方式...

    浅析Java设计模式【3】——代理.pdf

    ### 浅析Java设计模式【3】——代理 #### 一、代理模式概述 代理模式是一种行为型设计模式,主要用于在客户端与目标对象之间起到一个中介的作用,通过代理对象来控制对目标对象的访问。代理模式的核心在于它可以...

    基于Java的设计模式-代理模式demo的实现(高分课设)

    基于Java的设计模式——代理模式demo的实现(高分课设)个人经导师指导并认可通过的98分大作业设计项目,适用人群:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业或毕业设计,作为“参考资料”使用...

    《java设计模式》课后习题模拟试题解答——刘伟.zip

    本资料“《java设计模式》课后习题模拟试题解答——刘伟.zip”主要涵盖了Java设计模式的学习与应用,特别是针对刘伟教授的相关课程的课后习题及模拟试题的解答。 设计模式分为三大类:创建型、结构型和行为型模式。...

    设计模式——代理模式

    此外,代理模式还可以利用动态代理技术,例如Java中的`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口,这使得在运行时动态创建代理对象成为可能,而无需预先知道所有可能的代理类。...

    《Java设计模式》刘伟 课后习题及模拟试题答案.rar

    《Java设计模式》是刘伟老师的一本经典教材,它深入浅出地讲解了软件设计中的重要概念——设计模式。设计模式是经验丰富的开发者在解决常见问题时总结出的通用解决方案,是软件开发中的智慧结晶。这本书的课后习题和...

    JAVA设计模式(代理模式)

    **Java设计模式——代理模式详解** 代理模式是软件设计模式中的一个重要组成部分,它在Java编程中扮演着举足轻重的角色。代理模式的核心思想是为一个对象提供一个替身,这个替身即代理对象,代理对象可以控制对原...

    Java设计模式源代码——自己看pdf写的

    Java设计模式是软件开发中的重要概念,它是一种在特定情境下解决问题的经验总结,可以提高代码的可读性、可维护性和可复用性。在这个压缩包文件“DesignPatterns”中,很可能包含了各种Java设计模式的源代码实现。...

    设计模式-Java语言中的应用(pdf)

    《设计模式——Java语言中的应用》是一本专为Java开发者深入理解面向对象设计而编写的经典书籍。设计模式是软件工程领域中经过实践验证的、解决常见问题的有效方案,它们代表了在特定上下文中,针对特定问题的最优...

    JAVA 设计模式 工厂模式 代理模式 迭代模式 责任链模式 源码

    以下是关于JAVA设计模式中提及的四种模式——工厂模式、代理模式、迭代器模式以及责任链模式的详细说明。 1. **工厂模式**:工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,当创建...

    Java与模式——源码

    《Java与模式——源码》这个主题涉及到的是Java编程语言中的设计模式应用,以及如何通过源代码来理解和学习这些模式。设计模式是软件工程中的一种最佳实践,它们是解决常见问题的经验总结,使得代码更易读、易维护、...

    java设计模式经典教程

    ### Java设计模式经典教程知识点概览 #### 一、设计模式概述 设计模式是一种软件设计方法,它为软件开发者提供了一种标准化的方式去解决常见的软件设计问题。设计模式的使用可以提高代码的可读性和可维护性,同时...

    java23种设计模式——图解——附带源码

    以上两种创建型模式,即工厂方法模式和抽象工厂模式,是Java设计模式中非常重要的一部分,它们可以帮助开发者更好地管理对象的创建过程,提高系统的灵活性和可扩展性。接下来的部分将继续探讨其他的设计模式。

    java设计模式——告诉新手一些不知道的东西

    在编程世界中,Java设计模式是面向对象编程领域的一个重要概念,它为解决常见的软件设计问题提供了可重用的解决方案。对于新手来说,设计模式可能显得深奥难懂,但它们实际上是经验丰富的开发者用来提高代码质量、可...

    java设计模式

    目录: 前 言 第一部分 大旗不挥,谁敢冲锋——热身篇 第1章 单一职责原则 1.1 我是“牛”类,我可以担任多职吗 1.2 绝杀技,打破你的传统思维 1.3 我单纯,所以我快乐 1.4 最佳实践 ...附录:23个设计模式

    设计模式精解——GoF23中设计模式解析

    ### 设计模式精解——GoF23中设计模式解析 #### 重要性与起源 设计模式是软件工程领域的一项重要研究,它提供了一系列解决常见软件设计问题的模板。GoF23指的是由Erich Gamma、Richard Helm、Ralph Johnson和John ...

Global site tag (gtag.js) - Google Analytics