摘要:感受设计演变过程中所蕴含的大智慧,体会乐与怒的程序人生中值得回味的一幕幕。本文转自大话设计模式第七章之代理模式!
本文转载于:http://blog.csdn.net/monkey_d_meng/article/details/5689877
7.1为别人做嫁衣
“小菜,今天见这个叫娇娇的美女见得如何呀?”大鸟一回家来就问小菜。
“唉,别提了,人家是有男朋友的。”小菜无精打采地答道。
“有男朋友了啊,这倒是我没料到,那为什么还找你帮忙修电脑?”
“她男友叫戴励,在北京读大学呢,他们高中就开始谈恋爱了。”小菜说,“而且她还告诉了我一件比较有趣的事。”
“哦,是什么?”
“是这样的,我们在吃饭的时候,我就问她,怎么不找男友帮修电脑。她说男友在北京读书,所以没办法帮助修。我心里一想,‘你在上海怎么男友会在北京’,正想问他们是怎么认识的,她却接着问我想不想知道他男友追她的事。哈,这不正是我所希望的吗,于是我就跟着她开始了美好的回忆。”
“又不是你谈恋爱,说得这么肉麻,还‘美好的回忆’。她回忆什么了?”
“当时她是这么说的:‘那是在我高中二年级时的一天下午……’”
“娇娇同学,这是有人送你的礼物。”一个男生手拿着一个芭比娃娃送到她的面前。
“戴励同学.这是什么意思?”娇娇望着同班的这个男生,感觉很奇怪。
“是这样的,我的好朋友,隔壁三班的卓贾易同学,请我代他送你这个礼物的。”戴励有些脸红。
“为什么要送我礼物,我不认识他呀。”
“他说……他说……他说想和你交个朋友。”戴励脸更红了,右手抓后脑勺,说话吞吞吐吐。
“不用这样,我不需要礼物的。”娇娇显然想拒绝,
“别别别,他是我最好的朋友,他请我代他送礼物给你,也是下了很大决心的,你看在我之前时常帮你辅导数学习题的面子上,就接受一下吧。”戴励有些着急。
“那好吧,今天我对解析几何的椭圆那里还是不太憧,你再给我讲讲。”娇娇提出条件后接过礼物。
“没问题,我们到教室去讲吧。”戴励松了口气。
几天后
“娇娇,这是卓贾易送你的花。”
“娇娇,这是卓贾易送你的巧克力。”
“我不要他送的东西了,我也不想和他交朋友。我愿意……我愿意和你做朋友!”娇娇终于忍不住了,
直接表白。
“啊,……我不是在做梦吧……”戴励喜从天降,不敢相信。
“呆子!”娇娇微笑地骂道。
戴励用手抓了抓头发说,“其实我也喜欢你。不过,……不过,那我该如何向卓贾易交待昵?”
从此戴励和娇娇开始恋爱了。毕业后,戴励考上了北京XX大学,而娇娇读了上海的大专。
“喂,醒醒,还在陶醉呀。这个戴励根本就是一个大骗子,哪有什么卓贾易,这是他自己想泡MM找的借口。”大鸟不屑一顾。
“我当时也是这么想的,但她说是真的有这个人,后来那个卓贾易气死了,差点和戴励翻脸。”小菜肯定地说。
“那就不能怪戴励了,卓贾易就是为别人在做嫁衣,所以自己苦恼也是活该,谁叫他不自己主动,找人代理谈恋爱,神经病呀,”
“是呀,都怪他自己。为别人做嫁衣的滋味不好受哦。”
“这里又可以谈到一个设计模式了。”
“你不说我也知道是哪一个,代理模式对吧?”
“哈,说得没错。小菜真是越来越聪明。”
“去去去,口是心非的东西,代理模式又是怎么讲的?”
“你先试着写如果卓贾易直接追娇娇,应该如何做?”
7.2没有代理的代码
十分钟后,小菜写出了第一份代码。
结构图
- //被追求者类
- public class SchoolGirl
- {
- public String name;
- public String getName()
- {
- return this.name;
- }
- public void setName(String name)
- {
- this.name = name;
- }
- }
- //追求者类
- public class Pursuit
- {
- SchoolGirl mm;
- public Pursuit(SchoolGirl mm)
- {
- this.mm = mm;
- }
- public void giveDolls()
- {
- System.out.println(mm.name + " 送你洋娃娃");
- }
- public void giveFlowers()
- {
- System.out.println(mm.name + " 送你鲜花");
- }
- public void giveChocolate()
- {
- System.out.println(mm.name + " 送你巧克力");
- }
- }
- //客户端代码
- public class Main
- {
- public static void main(String[] args)
- {
- SchoolGirl jiaojiao = new SchoolGirl();
- jiaojiao.setName("李娇娇");
- Pursuit zhuojiayi = new Pursuit(jiaojiao);
- zhuojiayi.giveDolls();
- zhuojiayi.giveFlowers();
- zhuojiayi.giveChocolate();
- }
- }
“我了个擦,娇娇并不认识卓贾易,这样写的话不就等于卓贾易自己去送东西了嘛。”
“是哇,这如何处理来着?”
“而且,你丫把戴励给弄哪去了?”
“哈,对的对的,戴励就是代理啊。”
7.3只有代理的代码
十分钟后。
结构图
- //被追求者类
- public class SchoolGirl
- {
- public String name;
- public String getName()
- {
- return this.name;
- }
- public void setName(String name)
- {
- this.name = name;
- }
- }
- //代理类
- public class Proxy
- {
- SchoolGirl mm;
- public Proxy(SchoolGirl mm)
- {
- this.mm = mm;
- }
- public void giveDolls()
- {
- System.out.println(mm.name + " 送你洋娃娃");
- }
- public void giveFlowers()
- {
- System.out.println(mm.name + " 送你鲜花");
- }
- public void giveChocolate()
- {
- System.out.println(mm.name + " 送你巧克力");
- }
- }
- //客户端代码
- public class Main
- {
- public static void main(String[] args)
- {
- SchoolGirl jiaojiao = new SchoolGirl();
- jiaojiao.setName("李娇娇");
- Proxy daili = new Proxy(jiaojiao);
- daili.giveDolls();
- daili.giveFlowers();
- daili.giveChocolate();
- }
- }
“我了个擦,你丫写的是个啥?”
“这又有什么问题,为什么出错的总是我。”
“你把Pursuit(追求者)换成了Proxy(代理),把卓贾易换成戴励。这就使得这个礼物变成是戴励送的,而你刚才还肯定地说,卓贾易这个人是存在的,礼物是他买的,你这怎么能正确呢?”
“哦,我明白了,我这样写把Pursuit追求者给忽略了,事实上应该Pursuit追求者通过Proxy代理送给SchoolGirl被追求者礼物,这才是合理的。那我应该如何办呢? SchoolGirl被追求者送的礼物是Pursuit追求者买的,实质是还是追求者Pursuit送的,只是通过Proxy代理了。”
“很好,既然两者都有相同的方法,那就意味着他们都怎样?”
“哦,你的意思是他们都实现了同样的接口?我想,我可以写出代码来了。”
“小菜开窍了。”
7.4符合实际的代码
十分钟后。小菜第三份代码。
结构图
- //代理接口
- public interface GiveGift
- {
- void giveDolls();
- void giveFlowers();
- void giveChocolate();
- }
- //追求者类
- public class Pursuit implements GiveGift
- {
- SchoolGirl mm;
- public Pursuit(SchoolGirl mm)
- {
- this.mm = mm;
- }
- public void giveDolls()
- {
- System.out.println(mm.name + " 送你洋娃娃");
- }
- public void giveFlowers()
- {
- System.out.println(mm.name + " 送你鲜花");
- }
- public void giveChocolate()
- {
- System.out.println(mm.name + " 送你巧克力");
- }
- }
- //代理类
- public class Proxy implements GiveGift
- {
- Pursuit gg;
- public Proxy(SchoolGirl mm)
- {
- gg = new Pursuit(mm);
- }
- public void giveChocolate()
- {
- gg.giveChocolate();
- }
- public void giveDolls()
- {
- gg.giveDolls();
- }
- public void giveFlowers()
- {
- gg.giveFlowers();
- }
- }
- //客户端代码
- public class Main
- {
- public static void main(String[] args)
- {
- SchoolGirl jiaojiao = new SchoolGirl();
- jiaojiao.setName("李娇娇");
- Proxy daili = new Proxy(jiaojiao);
- daili.giveDolls();
- daili.giveFlowers();
- daili.giveChocolate();
- }
- }
“这下好了,娇娇不认识追求她的人,但却可以通过代理人得到礼物。效果也达到了。”
“这就是代理模式。好了,我们来看看GoF对代理模式是如何描述的。”
7.5代理模式
代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问。
代理模式(Proxy)结构图
- //Subject类,定义了RealSubject和Proxy的共用接口,这样就在任何使用RealSubject的地方都可以使用Proxy。
- public interface Subject
- {
- public void request();
- }
- //RealSubject类,定义Proxy所代表的真实实体。
- public class RealSubject implements Subject
- {
- public void request()
- {
- System.out.println("真实的请求");
- }
- }
- //Proxy类,保存一个引用使用代理可以访问实体,并提供一个与Subject的接口相同的接口,这样的代理可以用替代实体。
- public class Proxy implements Subject
- {
- RealSubject realSubject;
- public void request()
- {
- if (null == realSubject)
- {
- realSubject = new RealSubject();
- }
- realSubject.request();
- }
- }
- //客户端代码
- public class Main
- {
- public static void main(String[] args)
- {
- Proxy proxy = new Proxy();
- proxy.request();
- }
- }
7.6代理模式应用
“那代理模式一般应用于什么场合呢?”
“一般来说可以分为以下几种:第一,远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。”
“这么抽象的说,你能不能举个具体点的例子说明一下。”
“其实你一定用过的,WebService在.NET中的应用是怎样做的?”
“哦,我明白什么叫远程代理了,当我在应用程序的项目中加入一个Web引用,引用一个WebService,此时会在项目中生成一个WebReference的文件夹和一些文件,其实它们就是代理,这就使得客户端程序调用代理就可以解决远程访问的问题。原来这就是代理模式的应用啊。”
“第二种应用是虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。这样就可以达到性能的最优化,比如说你打开一个很大的HTML网页时,里面可能有很多的文字和图片,但你还是可以很快地打开它,此时你所看到的所有文字,但图片却是一张一张地下载后,才能看到的。那些未打开的图片框,就是通过虚拟代理来替代了真实的图片,此时代理存储了真实图片的路径和尺寸。”
“哦,原来浏览器当中是用代理模式来优化下载的啊。”
“第三种应用是安全代理,用来控制真实对象访问时的权限。一般用于对象应该有不同的访问权限的时候。第四种是智能指引,是指当调用真实对象时,代理处理另外一些事。如计算真实对象的引用次数,这样当该对象没有引用时,可以自动释放它;或当第一次引用一个持久对象时,将它装入内存;或在访问一个实际对象前,检查是否已经锁定它,以确保其他对象不能改变它。它们都是通过代理在访问一个对象时附加一些内务处理。”
“啊,原来代理可以做这么多的事情啊,我还以为它是一个很不常用的模式呢。”
“代理模式其实就是在访问对象时引入一定程度的间接性,因为这种间接性,可以附加多种用途。”
“哦,明白,说白了,代理就是真实对象的代表。”
7.7秀才让小六代其求婚
“好了,看会儿电视吧,好几天没看《武林外传》了。”大鸟打开了电视,此时武林外传正在播放第22集。
当播放到最后片段时,剧中,郭芙蓉对吕秀才恶狠狠地说:“吕秀才,是你让小六向我求婚的吧?”
“造物弄人!”吕秀才惨惨地答道,“这只是一个玩笑。”
“哦! ……玩笑!”郭芙蓉冷笑地说,“我杀了你!”
秀才速奔出去,郭芙蓉口中叫着“你给我站住!”跟着跑了出去……
小菜和大鸟看到这里,转头相互看着对方,小菜说:“吕秀才让燕小六代其向郭芙蓉求婚,这不就是…”,两人异口同声的说:“代一理一模一式!”
相关推荐
Java设计模式之代理模式(结构)Java设计模式之代理模式(结构)Java设计模式之代理模式(结构)Java设计模式之代理模式(结构)Java设计模式之代理模式(结构)
JAVA设计模式之代理模式实例
Java设计模式——代理设计模式(静态代理和动态代理) 各种情况例子源码
Java 经典设计模式讲解以及项目实战 设计模式简介:主要介绍各种设计模式的概念和运用场景等 设计模式综合运用:主要是笔者在实际工作中运用到的一些设计模式综合运用事例的提炼 Spring设计模式简介:主要是讲述...
Java 设计模式 代理模式介绍,含源码
Java设计模式之代理模式 1.代理模式 1.1 静态代理 1.2 动态代理 1.3.代理模式使用原因和应用方面
用myeclipse开发的java设计模式课程设计,课题内容为西瓜工厂,包含四个设计模式,单例模式、代理模式、建造者模式和抽象工厂模式,有较好的图形界面,文档内附有完整代码,适用于新手学习。
设计模式之Proxy(代理) 设计模式之Adapter(适配器) 设计模式之Composite(组合) 设计模式之Decorator(油漆工) 设计模式之Bridge 设计模式之Flyweight(享元) 行为模式: 设计模式之Template 设计模式之Memento(备忘机制...
使用5种设计模式完成的一个点单系统,显示不同系列下的所有商品,点击选择冰度甜度之后添加到订单中,计算总金额,下单之后发送订单到门店的后厨制作商品。使用了抽象工厂模式、装饰模式、单例模式、代理模式、原型...
java设计模式视频教程-代理模式, 深层了解java的设计模式
Java设计模式,代理模式,包含动态代理的Demo,具体的思想与实现有很多讲得很好的老师,我是看厉风行老师的视频学的,讲得不错,简单易懂
代理模式又叫Proxy模式(英文)。所谓的代理,就是一个人或者一个机构代替另一个人或者另一个机构去做一些事情。(类似于中介或者代理商)。
这是JAVA设计模式中属于结构模式的部分,包括Flyweight(共享模式)、Bridge(桥模式)、Decorator(装饰模式)、Composite(组合模式)、Adapter(适配器模式)、Proxy(代理模式)、Facade (外观模式)的源代码。其中有些模式中...
设计模式之代理模式 学习
Java设计模式之代理模式[收集].pdf
JAVA 设计模式: 工厂模式 代理模式 迭代模式 责任链模式 源码
设计模式主要分为三大类: 1.创建型模式:工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式。 2.结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。 4.行为型模式:...
//代理模式内部引用了真实角色 public void requst() { this.preRequest(); //在真实角色操作之前所附加的操作 if(null == realsubject) { realsubject = new ReallSubject(); } realsubject.requst(); // ...
java 设计模式 mvc模式 单例模式 代理 工厂 简单工厂
java 代理模式实现代码及设计详解:动态代理模式、静态代理模式