java設計模式之代理模式 ,以及和java 回調機制的區別
- java 代理模式就是:
將自己要做的事交給別人去做(這個別人就是代理者,自己就是被代理者),為什麽自己能做的要交給別人去做了?假如一個小學生小明,現在要寫作業,但是又想玩遊戲,他更想玩遊戲,並且不想被媽媽罵,所有他找了個天才槍手,小紅給他代寫作業,自己再去把作業交給媽媽檢查。小明媽媽看見是小明交的作業,也就沒懷疑不是他自己的做的。目的達到了,過程就不那麽重要了(當然不是不對的了,這裏只是為了講述設計模式而模擬的某種場景)。
2.代理模式要點:
1.一個抽象的主題(這裏抽象的主題就是寫作業)
2.一個代理者(小紅),繼承抽象主題(寫作業)
3.一個被代理者(小明),繼承抽象主題(寫作業)
4.一個管理者繼承抽象主題,一個被代理者對象(3 和 4 可以任選一個,3 是將被代理者和管理者合並成一個 ,4 是將被代理者 和 管理者分開)
3.代理模式的應用:spring AOP 面相切面編程,例如事物的管理委托給spring 容器去管理,程序員只用關系核心業務層,高度復用的模塊交給代理者去做,不用重復的工作。增加系統的代碼冗余。
代碼:
抽象主題
package javadesign.staticProxy; /** * Created by Administrator on 2017/12/21. * * 概念:某項任務要交給對象A完成,C又把A 的任務交給了B去做,A就是被代理者,B就是代理者,C 就是委托人 * * 實現:創建一個代理的主題,代理者和被代理者都繼承這個類並且,實現主題 * 為什麽代理類和被代理類都要實現這個?現在有個做作業的任務,抽象出來一個做作業的主題。 * * 場景 :一天小明的媽媽讓小明做作業,首先小明得接受做作業這個任務,所以他繼承做作業這個主題, * 但是小明想打遊戲,作業還必須得完成,他找到一個瞞天過海的方法,讓小紅去做作業,但是還要偽裝成自己的做的, * 所以小紅也得繼承做作業這個主題 * * 效果:小紅 和 小明 都是調用同一個做作業名稱,小明媽媽傻傻分不清楚,到底是誰做的作業(真正是小紅做的,只是小明媽媽不知道), * 這就達到了代理的目的 **/ public interface ProxyWork { public void doHomeWork(); }
被代理者(or 委托者)
package javadesign.staticProxy; import org.junit.Test; /** * Created by Administrator on 2017/12/21. * 創建一個代理的管理者,將要代理的任務分配給真正的處理任務的類,就是小明把自己的作業交給小紅學霸做啦 */ public class ProxyManager implements ProxyWork { private ProxyWork proxyWork;/* * 這個方法是設置代理的方法,運用到了java 多態的思想 * */ public void setAgency(ProxyWork proxyWork){ this.proxyWork=proxyWork; // 這個方法是將真正的代理類(小紅)作為參數傳遞給 } @Override public void doHomeWork() { System.out.println("小明開始假裝做作業"); //其實小明沒有做作業,而是叫來小紅,讓小紅去做 if(this.proxyWork!=null){ //先判斷小紅的引用是否傳遞過來 proxyWork.doHomeWork(); //這裏小紅開始做作業,實施瞞天過海大計的關鍵一步 } System.out.println("小明告訴媽媽,作業完成了"); } /* * 開始測試代理,模擬一個場景 * * */ @Test public void client(){ ProxyManager proxyManager=new ProxyManager(); proxyManager.setAgency(new ProxyRealWork()); //new ProxyRealWork 創建一個名叫小紅的代理者 proxyManager.doHomeWork(); //小明開始假裝做作業,真正做作業的是小紅 } }
代理者:
package javadesign.staticProxy; /** * Created by Administrator on 2017/12/21. */ public class ProxyRealWork implements ProxyWork { private ProxyWork proxyWork; //將被代理者,也就是遊戲小王子小明傳遞過來,其實也就是java 的多態 //這裏傳入被代理者,用到了多態 public void setAgency(ProxyWork proxyWork){ //這裏將會傳入實例化的小明 this.proxyWork=proxyWork; } /* 這個代理者是真正做作業的人,也即是小紅這個學霸 */ @Override public void doHomeWork() { this.before(); //這個位置也就是相當於Spring Aop 切點的位置service 層 System.out.println(" 真正的任務執行者,正在執行任務,也就是小紅做作業啦"); this.after(); } /* * 這裏的預處理和善後處理類似於Spring的面向切面編程,具體的實現有事務管理,日誌等 * */ //預處理動作 private void before(){ //TODO System.out.println(" 小紅預溫習了功課,然後開始做作業"); } //善後處理 private void after(){ //TODO System.out.println(" 小紅把做完的作業又檢查了一遍,不能做的全對,不然太假了"); } }
代理模式和回調模式的區別:
本人認為兩者是相同的,都是同一種思想(自己的事情交給別人做,自己發出命令),若要真的找不同,那就從他們具體的實現方式(代理模式:追求主題的統一,發出命令,各謀其事;回調機制:追求通知,發出命令,接受通知)
註釋:本文中的代理模式是靜態代理,耦合性很高,在項目中可能很少用,所以項目中要開發通用的代理就要利用反射機制,實現動態代理。(例如 小紅 要幫小明,小張,小王三個人寫作業,他們的作業本的要分別對應他們三個人,不能只對應某個人)
註明:本文原創,可以轉載,可以評論,有不對的地方歡迎指正,在別的地方看到類似的文章,不喜勿噴,只是自己加深理解寫的文章 。
java設計模式之代理模式 ,以及和java 回調機制的區別