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-02 15:15:35