代理模式相对于其他的设计模式来说比较简单:什么是代理模式呢?我很忙,忙的没空理你,那你要找我呢就先找我的代理人吧,那代理人总要知道被代理人能做哪些事情不能做哪些事情吧,那就是两个人具备同一个接口,代理人虽然不能干活,但是被代理人可以。
这里举个例子是模仿了《您的设计模式》中的经典案例,案例中讲述了一个小故事,就是西门庆、潘金莲、王婆之间的故事,水浒里是这样写的:西门庆被潘金莲用竹竿敲了一下难道,痴迷了,被王婆看到了, 就开始撮合两人好事,王婆作为潘金莲的代理人收了不少好处费 ,那我们假设一下:如果没有王婆在中间牵线,这两个不要脸的能成吗?难说的很!
1、首先要定义一个接口,代理人和被代理人要同时具备这一个接口;
package com.dongl.proxy; /** * 定义一种类型的女人,王婆和潘金莲都属于这个类型的女人 */ public interface KindWomen { //这种类型的女人能做什么事情呢? public void makeEyesWithMan(); //抛媚眼 public void talkWithMan(); //能够交谈 }
2、第二步:让代理人和被代理人同时实现这个接口,并且定义自己的方法;
2.1、首先定义潘金莲属于可爱的女人可以和男生抛媚眼、交谈;
package com.dongl.proxy; /** * 定一个潘金莲是什么样的人 */ public class PanJinLian implements KindWomen { @Override public void talkWithMan() { System.out.println("潘金莲 和男生交谈-------------"); } @Override public void makeEyesWithMan() { System.out.println("潘金莲抛媚眼---------------------"); } }
2.2、定义一个贾氏也可以和男生抛媚眼、交谈;
package com.dongl.proxy; /** * 定一个贾氏是什么样子的人 */ public class JiaShi implements KindWomen { @Override public void makeEyesWithMan() { System.out.println("贾氏 抛媚眼--------------"); } @Override public void talkWithMan() { System.out.println("贾氏 和男生交谈-------------"); } }
2.3、王婆这个老狐狸知道自己长得又老又丑没有男人愿意和他触膝长谈,交流人生,但是她有智慧,他见多识广,认识很多女生,可以向男生保媒拉纤;
package com.dongl.proxy; /** * 王婆这个人老聪明了,她太老了,是个男人都看不上, * 但是她有智慧有经验呀,她作为一类女人的代理! */ public class WangPo implements KindWomen { private KindWomen kindWomen; public WangPo() { this.kindWomen = new PanJinLian(); } public WangPo(KindWomen kindWomen) { this.kindWomen = kindWomen; } @Override public void makeEyesWithMan() { kindWomen.makeEyesWithMan(); } @Override public void talkWithMan() { kindWomen.talkWithMan(); } }
第三步:男主登场,这时奶油小生西门庆来了,被潘金莲用竹竿打了一下,好像是迷上了潘小姐,这一幕恰巧被王婆看见了,然后以代理人的角色出现了,适当收点代理费,把这两个不要脸的戳合在一起了,然后就有了西门庆和潘金莲的交流人生:
package com.dongl.proxy; /** * 定义一个西门庆 这人 喜欢和女生交流心得体会 * 经常和潘金莲触膝长谈 你侬我侬的样子可真叫人羡慕 */ public class XiMenQing{ /** * 水浒里是这样写的:西门庆被潘金莲用竹竿敲了一下难道,痴迷了, * 被王婆看到了, 就开始撮合两人好事,王婆作为潘金莲的代理人 * 收了不少好处费,那我们假设一下: * 如果没有王婆在中间牵线,这两个不要脸的能成吗?难说的很! */ public static void main(String[] args) { WangPo wangPo = new WangPo(); wangPo.talkWithMan(); wangPo.makeEyesWithMan(); /**如果西门庆不单单想和潘金莲成为好朋友 还想和贾氏成为好朋友 * 这时西门庆又找到了王婆 说:我想和贾氏成为朋友 王婆肯定又收取了一大笔中介费 * 这时可以调用王婆的有参构造 */ WangPo wangPo1 = new WangPo(new JiaShi()); wangPo1.makeEyesWithMan(); wangPo1.talkWithMan(); } }
到这里代理模式就介绍完了,虽然例子有点污,但是还是很容易理解的。