java 靜態(tài)代理 動態(tài)代理深入學習
一、代理模式
代理模式是常用的java設(shè)計模式,特征是代理類與委托類有同樣的接口,代理類主要負責為委托類預(yù)處理消息、過濾消息、把消息轉(zhuǎn)發(fā)給委托類,以及事后處理消息等。
代理類與委托類之間通常會存在關(guān)聯(lián)關(guān)系,一個代理類的對象與一個委托類的對象關(guān)聯(lián),代理類的對象本身并不真正實現(xiàn)服務(wù),而是通過調(diào)用委托類的對象的相關(guān)方法,來提供特定的服務(wù)。
按照代理的創(chuàng)建時期,代理類可以分為兩種:
靜態(tài)代理:由程序員創(chuàng)建或特定工具自動生成源代碼再對其編譯。在程序運行前代理類的.class文件就已經(jīng)存在了。
動態(tài)代理:在程序運行時運用反射機制動態(tài)創(chuàng)建而成。
二、單個靜態(tài)代理
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
三、多個靜態(tài)代理
在上面代碼的基礎(chǔ)上新增了
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");
}
}
調(diào)用代碼就變成了
// 體現(xiàn)了聚合的思想,代理之間的組合
public static void main(String[] args)
{
CountTrancProxy trancProxy = new CountTrancProxy(new CountDaoImpl());
CountLogProxy logPro = new CountLogProxy(trancProxy);
logPro.queryCount();
}
Log start
事務(wù)處理之前
查看賬戶方法...
事務(wù)處理之后
Log end
四、總結(jié)
其實可以用代理類可以用繼承或?qū)崿F(xiàn)接口兩種方式達到代理的效果,但是當多個代理類需要相互組合的時候,繼承就不靈活了,需要不斷重寫代理類,而實現(xiàn)接口的方式就十分容易通過的聚合實現(xiàn)代理類之間的組合。
相關(guān)文章
如何使用IDEA2022.1?創(chuàng)建Spring?Boot項目
這篇文章主要介紹了如何使用IDEA2022.1?創(chuàng)建Spring?Boot項目,大家在使用idea開發(fā)工具時發(fā)現(xiàn)給以往的版本略微的不同,細心的小編在此記錄下,需要的朋友可以參考下2022-08-08
淺談Spring Cloud中的API網(wǎng)關(guān)服務(wù)Zuul
這篇文章主要介紹了淺談Spring Cloud中的API網(wǎng)關(guān)服務(wù)Zuul,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10
70行Java代碼實現(xiàn)深度神經(jīng)網(wǎng)絡(luò)算法分享
這篇文章主要介紹了70行Java代碼實現(xiàn)深度神經(jīng)網(wǎng)絡(luò)算法分享,涉及神經(jīng)網(wǎng)絡(luò)的計算過程,神經(jīng)網(wǎng)絡(luò)的算法程序?qū)崿F(xiàn),多層神經(jīng)網(wǎng)絡(luò)完整程序?qū)崿F(xiàn)等相關(guān)內(nèi)容,具有一定參考價值,需要的朋友可以參考下。2017-11-11

