代理模式中,生活中仍是比較常見的,可是此次我想舉個比較接地氣的例子,嘿嘿嘿..雖然有點污,可是我的以爲還算是比較接地氣吧,下面就來看看吧.....
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