代理模式中,生活中仍是比较常见的,可是此次我想举个比较接地气的例子,嘿嘿嘿..虽然有点污,可是我的以为还算是比较接地气吧,下面就来看看吧.....
public interface BadWoman { //抛媚眼 void makeEyesWithMan(); //嘿嘿嘿 void happyTimeWithMan(); }
public class PanJinLian implements BadWoman { @Override public void makeEyesWithMan() { System.out.println("潘金莲,抛媚眼"); } @Override public void happyTimeWithMan() { System.out.println("潘金莲...嘿嘿嘿..."); } }
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(); } }
能够看到,虽然调用的是代理者王婆,可是实际上执行者是潘金莲,这个西门庆可不知道,他只知道,他调用的是王婆的方法,并且,经过代理模式,咱们能够增强对代理者的访问,在代理者调用被代理者行为前,作一些其它的处理,例如: 增长参数处理,打印等等...并且咱们要替换代理者也很容易,具体以下java
咱们能够试试替换下王婆的被代理者,由潘金莲变成贾氏,咱们定义一个贾氏,也实现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类图app
到这,文章就结束了!ide
以上,均为本人我的理解,比较简单的理解,或许跟各位看官理解的有出入,欢迎指正交流this
欢迎转载,请注明出处跟做者,谢谢!spa