代理模式中,生活中还是比较常见的,但是这次我想举个比较接地气的例子,嘿嘿嘿..虽然有点污,但是个人觉得还算是比较接地气吧,下面就来看看吧.....
水浒传大家应该都看过吧,其中潘金莲跟西门庆是怎么勾搭在一起的,通过王婆对吧,就是因为王婆的牵线搭桥,才让西门庆跟潘金莲勾搭在一起的,那么,我们就可以看成,王婆是潘金莲的代理,西门庆通过访问王婆,得到了潘金莲,做了苟且之事,我们先定义一个接口,叫做 BadWoman
public interface BadWoman {
//抛媚眼
void makeEyesWithMan();
//嘿嘿嘿
void happyTimeWithMan();
}
接着定义一个潘金莲,实现BadWoman接口,作为被代理者,由王婆来代理潘金莲跟谁做苟且之事
public class PanJinLian implements BadWoman {
@Override
public void makeEyesWithMan() {
System.out.println("潘金莲,抛媚眼");
}
@Override
public void happyTimeWithMan() {
System.out.println("潘金莲...嘿嘿嘿...");
}
}
然后在定义一个王婆,实现BadWoman接口,因为代理者要知道被代理者做什么操作,肯定要实现共同接口来保证能代理者的行为
public class WangPo implements BadWoman {
//通过多态进行代理
private BadWoman badWoman;
//默认给潘金莲代理
public WangPo() {
this.badWoman = new PanJinLian();
}
//可以替换被代理者
public WangPo(BadWoman badWoman) {
this.badWoman = badWoman;
}
//调用的是王婆的抛媚眼方法,实际上执行者是被代理者
@Override
public void makeEyesWithMan() {
badWoman.makeEyesWithMan();
}
//跟抛媚眼一样
@Override
public void happyTimeWithMan() {
badWoman.happyTimeWithMan();
}
}
最后,我们在定义一个西门庆,来调用代理者(王婆)跟西门庆做苟且之事
public class XiMenQing {
public static void main(String[] args){
System.out.println("呼叫王婆..");
WangPo wangPo = new WangPo();
wangPo.makeEyesWithMan();
wangPo.happyTimeWithMan();
}
}
可以看到,虽然调用的是代理者王婆,但是实际上执行者是潘金莲,这个西门庆可不知道,他只知道,他调用的是王婆的方法,而且,通过代理模式,我们可以加强对代理者的访问,在代理者调用被代理者行为前,做一些其它的处理,例如: 增加参数处理,打印等等...而且我们要替换代理者也很容易,具体如下
我们可以试试替换下王婆的被代理者,由潘金莲变成贾氏,我们定义一个贾氏,也实现BadWoman接口
public class JiaShi implements BadWoman {
@Override
public void makeEyesWithMan() {
System.out.println("贾氏抛媚眼");
}
@Override
public void happyTimeWithMan() {
System.out.println("贾氏..嘿嘿嘿...");
}
}
然后西门庆类增加下代码,替换掉王婆默认的被代理者
public class XiMenQing {
public static void main(String[] args){
System.out.println("呼叫王婆..");
JiaShi jiaShi = new JiaShi();
WangPo wangPo = new WangPo(jiaShi);
wangPo.makeEyesWithMan();
wangPo.happyTimeWithMan();
}
}
这样,我们用最小的代价完成了被代理者的替换,而且,代码耦合度低,替换被代理者只需换个实现,而且可以加强被代理者的访问,其它地方的代码都不需要变动,读者说如果你说: 我就需要变动,你打我! 笔者:来,你过来,我给你看个板砖,你那么多地方要变动,改不死你,面向接口编程的原则你忘了?最后是UML类图
到这,文章就结束了!
以上,均为本人个人理解,比较简单的理解,或许跟各位看官理解的有出入,欢迎指正交流
欢迎转载,请注明出处跟作者,谢谢!