黑马程序员技术交流社区
标题:
代理的疑问
[打印本页]
作者:
唐进
时间:
2012-10-26 19:58
标题:
代理的疑问
代理类是不是可以代理所有方法?
作者:
林志进
时间:
2012-10-26 23:09
getClass方法就不行,返回的还是目标类本身的字节码。
作者:
丁桂松
时间:
2012-10-27 05:34
代理类与被代理类,实现相同接口。可以代理接口的所有方法。
代理模式[Proxy Pattern]
什么是代理模式呢?我很忙,忙的没空理你,那你要找我呢,就先找我的代理人吧.那代理人总要知道被代理人能做哪些事情不能做哪些事情吧.那就是两个人具备同一个借口,代理人虽然不能干活,但是被代理人能干活啊.
比如西门庆找潘金莲,那潘金莲不好意思答复呀.咋办,找那个王婆做代理,表现在程序上是这样的.
先定义一种类型的女人:
package proxyPattern;
public interface KindWomen {
// I'm glad to share my knowledge with you all.
// 定义一种类型的女人,王婆和潘金莲都属于这个类型的女人
public void makeEyesWithMan();// 抛媚眼
public void happyWithMan();// happy what?you know that!
}
一种类型嘛 ,那肯定是接口,然后定义潘金莲.
package proxyPattern;
//潘金莲是什么样的人
public class PanJinLian implements KindWomen {
public void makeEyesWithMan() {
System.out.println("潘金莲抛媚眼...");
}
public void happyWithMan() {
System.out.println("潘金莲和男人做那个....");
}
}
再定一个丑陋的王婆.
package proxyPattern;
//王婆这个人老聪明了,她太老了.是个男人都看不上,但是她有智慧有经验呀,她做为一类女人的代理!
public class WangPo implements KindWomen {
private KindWomen kindWomen;
// 默认的话,是潘金莲的代理
public WangPo() {
this.kindWomen = new PanJinLian();
}
// 她可以是KindWomen的任何一个女人的代理,只要你是这一类型
public WangPo(KindWomen kindWomen) {
this.kindWomen = kindWomen;
}
public void happyWithMan() {
// 自己老了,干不了,可以让年轻的代替
this.kindWomen.happyWithMan();
}
public void makeEyesWithMan() {
// 这么大年龄了谁看她抛媚眼?!
this.kindWomen.makeEyesWithMan();
}
}
两个女主角都登场了.有请男主角:
package proxyPattern;
public class XiMenQing {
/**
* 水浒里这样写的,西门庆被潘金莲用竹竿敲了一下脑袋,痴迷了.
* 被王婆看到了,就开始撮合两人的好事,王婆作为了潘金莲的代理人
* 收了不少好处费,那我们假设一下:
* 如果没有王婆在中间牵线,这两个不要脸的能成么?难说的很!
*/
public static void main(String[] args) {
// 先把王婆叫出来
WangPo wangPo = new WangPo();
//然后西门庆就说,我要和潘金莲happy,然后王婆就安排了西门庆丢筷子的那出戏:
wangPo.makeEyesWithMan();
//看到没,虽然表面上是王婆在做,实际上爽的是潘金莲.
wangPo.happyWithMan();
}
}
这就是活生生的一个例子,通过代理人实现了某种目的.如果去掉王婆这个中间环节直接是潘金莲和西门庆勾搭.估计很难成就武松杀嫂事件.
那我们再考虑一下,水浒里还有没有这类型的女人,有,卢俊义的老婆贾氏(就是和固管家苟合的那个)那名字起的:"假使",那我们也让王婆做她的代理.
把贾氏素描出来:
package proxyPattern;
public class JiaShi implements KindWomen {
public void makeEyesWithMan() {
System.out.println("贾氏抛媚眼...");
}
public void happyWithMan() {
System.out.println("贾氏正在happy中...");
}
}
管家勾搭贾氏:
package proxyPattern;
public class GuanJia {
public static void main(String[] args) {
//管家勾搭贾氏.
JiaShi jiaShi = new JiaShi();
WangPo wangPo= new WangPo(jiaShi);//让王婆做为了贾氏的代理人
wangPo.makeEyesWithMan();
wangPo.happyWithMan();
}
}
说完这个故事,那我们总结一下,代理模式主要使用了java的多态.干活的是被代理类,代理类主要是接活.你让我干活.好,我交给幕后的类去干.你满意就成.那怎么知道被代理类能不能干呢?同根就成.大家知根知低.你能做啥.我能做啥都清楚的很.同一个接口呗.
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2