Java動態代理學習1——靜態代理
一、代理模式
代理模式是常用的java設計模式,特征是代理類與委托類有同樣的接口,代理類主要負責為委托類預處理消息、過濾消息、把消息轉發給委托類,以及事後處理消息等。
代理類與委托類之間通常會存在關聯關係,一個代理類的對象與一個委托類的對象關聯,代理類的對象本身並不真正實現服務,而是通過調用委托類的對象的相關方法,來提供特定的服務。
按照代理的創建時期,代理類可以分為兩種:
靜態代理:由程序員創建或特定工具自動生成源代碼再對其編譯。在程序運行前代理類的.class文件就已經存在了。
動態代理:在程序運行時運用反射機製動態創建而成。
二、單個靜態代理
public interface CountDao { // 查看賬戶方法 public void queryCount(); } public class CountDaoImpl implements CountDao { public void queryCount() { System.out.println("查看賬戶方法..."); } } public class CountTrancProxy implements CountDao { private CountDao countDao; public CountProxy(CountDao countDao) { this.countDao = countDao; } @Override public void queryCount() { System.out.println("tranc start"); countDao.queryCount(); System.out.println("tranc end"); } } public class TestCount { public static void main(String[] args) { CountTrancProxy countProxy = new CountTrancProxy(new CountDaoImpl()); countProxy.updateCount(); } }
tranc start
查看賬戶方法...
tranc end
三、多個靜態代理
在上麵代碼的基礎上新增了
public class CountLogProxy implements CountDao { private CountDao countDao; public CountLogProxy(CountDao countDao) { this.countDao = countDao; } @Override public void queryCount() { System.out.println("Log start"); countDao.queryCount(); System.out.println("Log end"); } }
調用代碼就變成了
// 體現了聚合的思想,代理之間的組合 public static void main(String[] args) { CountTrancProxy trancProxy = new CountTrancProxy(new CountDaoImpl()); CountLogProxy logPro = new CountLogProxy(trancProxy); logPro.queryCount(); }
Log start
事務處理之前
查看賬戶方法...
事務處理之後
Log end
四、總結
其實可以用代理類可以用繼承或實現接口兩種方式達到代理的效果,但是當多個代理類需要相互組合的時候,繼承就不靈活了,需要不斷重寫代理類,而實現接口的方式就十分容易通過的聚合實現代理類之間的組合。
最後更新:2017-04-04 07:32:09
上一篇:
C#委托基礎7——匿名方法
下一篇:
Android開發10——Activity的跳轉與傳值_顯示意圖(intent)的應用
《科技之巔2》序——機器智能數據智能:工具之王
如何不用重命名在文件管理器中隱藏文件和文件夾
地平線餘凱:自動駕駛處理器的“三國時代”| 清華人工智能研習社
寫給程序猿們的交互設計
secrets of the javascript Ninja(Function Type)(javascript忍者的秘密)
Android開發11——手機橫屏和豎屏與android:configChanges
MySQL · 引擎特性 · InnoDB Buffer Pool
你不知道的事兒三(CSS)
蘋果8plus屏幕被自己鎖了怎麼才能解開
深入並行:從生產者到消費者模型深度理解Oracle的並行