閱讀83 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

  上一篇:go java中采用Pull解析器對XML文件進行解析
  下一篇:go C#委托基礎7——匿名方法