Java靜態代理和動態代理


  代理模式

   一、概述

  代理是一種模式,提供了對目標對象的間接訪問方式,即通過代理訪問目標對象。如此便於在目標實現的基礎上增加額外的功能操作,前攔截,后攔截等,以滿足自身的業務需求,同時代理模式便於擴展目標對象功能的特點也為多人所用。

  二、圖形描述

  

  

  三、靜態代理

  靜態代理的實現比較簡單,代理類通過實現與目標對象相同的接口,並在類中維護一個代理對象。通過構造器塞入目標對象,賦值給代理對象,進而執行代理對象實現的接口方法,並實現前攔截,后攔截等所需的業務功能。

/**
 * 目標對象實現的接口
 * @author jiyukai
 */
public interface BussinessInterface {

	void execute();
}

/**
 * 目標對象實現類
 * @author jiyukai
 */
public class Bussiness implements BussinessInterface{

	@Override
	public void execute() {
		System.out.println("執行業務邏輯...");
	}
}

/**
 * 代理類,通過實現與目標對象相同的接口
 * 並維護一個代理對象,通過構造器傳入實際目標對象並賦值
 * 執行代理對象實現的接口方法,實現對目標對象實現的干預
 * @author jiyukai
 */
public class BussinessProxy implements BussinessInterface{
	
	private BussinessInterface bussinessImpl; 
	
	public BussinessProxy(BussinessInterface bussinessImpl) {
		this.bussinessImpl = bussinessImpl;
	}
	
	@Override
	public void execute() {
		System.out.println("前攔截...");
		bussinessImpl.execute();
		System.out.println("后攔截...");
	}
}

  靜態代理的總結

  優點:可以做到不對目標對象進行修改的前提下,對目標對象進行功能的擴展和攔截。

  缺點:因為代理對象,需要實現與目標對象一樣的接口,會導致代理類十分繁多,不易維護,同時一旦接口增加方法,則目標對象和代理類都需要維護。

  四、動態代理

  動態代理是指動態的在內存中構建代理對象(需要我們制定要代理的目標對象實現的接口類型),即利用JDK的API生成指定接口的對象,也稱之為JDK代理或者接口代理。

  

/**
 * 動態代理對象,無需實現任何接口
 * 通過傳入任何類型的目標對象並指定接口
 * 調用JDK接口動態創建代理對象
 * @author jiyukai
 */
public class ProxyFactory {

	private Object targetObject;
	
	public ProxyFactory(Object targetObject) {
		this.targetObject = targetObject;
	}
	
	public Object getProxyInstance(){
		return Proxy.newProxyInstance(
				targetObject.getClass().getClassLoader(), //和目標對象的類加載器保持一致
				targetObject.getClass().getInterfaces(), //目標對象實現的接口,因為需要根據接口動態生成對象
				new InvocationHandler() { //InvocationHandler:事件處理器,即對目標對象方法的執行
					
					@Override
					public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
						System.out.println("前攔截...");
						
						Object result = method.invoke(proxy, args);
						
						System.out.println("后攔截...");
						return result;
					}
				});
	}
}

   動態代理的總結

   優點:代理對象無需實現接口,免去了編寫很多代理類的煩惱,同時接口增加方法也無需再維護目標對象和代理對象,只需在事件處理器中添加對方法的判斷即可。

   缺點:代理對象不需要實現接口,但是目標對象一定要實現接口,否則無法使用JDK動態代理。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM