代理模式的定义:对其他对象提供一种代理以控制对这个对象的访问。
应用场景举例:
比如西门庆找潘金莲,那潘金莲不好意思答复呀,咋办,找那个王婆做代理,表现在程序上时是这样的体现的
先说说这个场景中的要素:一种类型的女人,潘金莲,王婆,西门庆,后来扩展的贾氏也和西门庆勾上了,我们是假设的,然后西门庆找潘金莲happy,但潘金莲不好意思直接,就找个王婆代理呗。我们看看具体代码。
先定义一种女人
package com.example.pattern; /** * * @author kakaxi *定义一种类型的女人,王婆和潘金莲都属于这个类型的女人 */ public interface KindWoman { //这种女人能做什么事情呢? public void makeEyesToMan();//抛媚眼 public void happyWithMan();//和男人那个.... }
一种类型嘛,那肯定是接口,然后定义个潘金莲
package com.example.pattern; /** * * @author kakaxi *定义一个潘金莲是什么样的人 */ public class PanJinLian implements KindWoman{ @Override public void makeEyesToMan() { // TODO Auto-generated method stub System.out.println("潘金莲抛媚眼..."); } @Override public void happyWithMan() { // TODO Auto-generated method stub System.out.println("潘金莲和男人在做那个..."); } }再定义个丑陋的王婆
package com.example.pattern; /** * * @author kakaxi *王婆这个人老聪明了,她太老了,是个男人都看不上她, *但是她有智慧经验呀,他作为一类女人的代理! */ public class WangPo implements KindWoman{ private KindWoman kindWom; public WangPo() { // TODO Auto-generated constructor stub this.kindWom=new PanJinLian();//默认的话是潘金莲的代理 } //她可以是KindWomam的任何一个女人的代理,只要你是这一类型 public WangPo(KindWoman allWoman){ this.kindWom=allWoman; } @Override public void makeEyesToMan() { // TODO Auto-generated method stub //王婆年纪大了,谁看她抛媚眼啊 kindWom.makeEyesToMan(); } @Override public void happyWithMan() { // TODO Auto-generated method stub //自己老了,干不了了,但可以叫年轻的代替。 kindWom.happyWithMan(); } }两个女主角都上场了,该男主角了,定义个西门庆
package com.example.pattern; /** * * @author kakaxi *水浒传是这样写的:西门庆被潘金莲用竹竿敲了一下,西门庆看痴迷了,被王婆看到了,就开始撮合两人好事,王婆作为潘金莲的代理人收了不少好处费,那我们假设一下: *如果没有王婆在中间牵线,这两个不要脸的能成事吗?难说得很! */ public class XiMenQiang { public static void main(String[] args) { System.out.println("------西门庆和潘金莲...-------"); //把王婆叫出来 WangPo wangPo=new WangPo(); //然后西门庆说,我要和潘金莲Happy,然后王婆就安排了西门庆丢筷子哪出戏: wangPo.makeEyesToMan(); //看到没有表面是王婆在做,其实爽的是潘金莲 wangPo.happyWithMan(); } }运行结果:
那这就是活生生的一个例子,通过代理人实现了某种目的,如果真去了王婆这个中间环节,直接西门庆和潘金莲勾搭,估计很难成就武松杀嫂事件。 那我们再考虑一下,水浒里面还有没有这类型的女人?有,卢俊义的老婆贾氏(就是和那个管家苟合的那个),这个名字起的:“贾氏”,那我们也让王婆做她的代理:
package com.example.pattern; /** * 定义一个贾氏是什么样的人 * @author kakaxi * */ public class JiaShi implements KindWoman{ @Override public void makeEyesToMan() { // TODO Auto-generated method stub System.out.println("贾氏抛媚眼..."); } @Override public void happyWithMan() { // TODO Auto-generated method stub System.out.println("贾氏和男人在做那个..."); } }西门庆勾潘金莲又勾引贾氏
package com.example.pattern; /** * * @author kakaxi *水浒传是这样写的:西门庆被潘金莲用竹竿敲了一下,西门庆看痴迷了,被王婆看到了,就开始撮合两人好事,王婆作为潘金莲的代理人收了不少好处费,那我们假设一下: *如果没有王婆在中间牵线,这两个不要脸的能成事吗?难说得很! */ public class XiMenQiang { public static void main(String[] args) { System.out.println("------西门庆和潘金莲...-------"); //把王婆叫出来 WangPo wangPo=new WangPo(); //然后西门庆说,我要和潘金莲Happy,然后王婆就安排了西门庆丢筷子哪出戏: wangPo.makeEyesToMan(); //看到没有表面是王婆在做,其实爽的是潘金莲 wangPo.happyWithMan(); System.out.println("------西门庆又和贾氏...-------"); JiaShi jiaShi=new JiaShi(); wangPo =new WangPo(jiaShi); wangPo.makeEyesToMan(); wangPo.happyWithMan(); } }运行结果:
潘金莲和贾氏就是被代理人,王婆就是代理人,王婆负责起中介作用,负责客户与被代理信息交流,真是的执行是潘金莲和贾氏,但是西门庆又不方便直接和被代理人信息交流,此时就需要个代理人。
代理模式主要使用了java的多态,干活的是被代理类,代理类主要是接活,你让我干活,好,我交给幕后的类去干,你满意就成,那怎么知道被代理类能不能干呢?因为都是使用同一个接口,大家知根知底,你能做啥,我能做啥都清楚得很。
现实世界中,明星都会有个经纪人,明星演出通告,那么通有相关会档期安排、宣传、等等相关工作就可以交给经纪人做,明星就只需要到时现在执行就行了,不需要亲自现场安排做那些事。
其实一个是真正的你要访问的对象(目标类),一个是代理对象,真正对象与代理对象实现同一个接口,先访问代理类再访问真正要访问的对象,代理中可以添加方法,或者设置一些限制,来起到了中介的作用和保护了目标对象的作用(上面的例子可不是代理保护被代理)。