設計模式 - 動態代理模式


package com.DynamicProxy3;

/**
 * 動態代理: 抽象角色(公共接口)
 * 
 * @author DW
 *
 */
public interface DoSomething
{	
	public void working(String work);
}

  


package com.DynamicProxy3;

/**
 * 動態代理: 真實角色
 * 
 * @author DW
 *
 */
public class Man implements DoSomething
{
	private String name;
	
	public Man(String name)
	{
		this.name = name;
	}
	
	@Override
	public void working(String work)
	{
		System.out.println(this.name + "在" + work);
	}
}

  


package com.DynamicProxy3;


/**
 * 動態代理: 真實角色
 * 
 * @author DW
 *
 */
public class Woman implements DoSomething
{
	private String name;

	public Woman(String name)
	{
		this.name = name;
	}
	
	@Override
	public void working(String work)
	{
		System.out.println(this.name + "在" + work);
	}
}

  


package com.DynamicProxy3;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 動態代理: 代理角色
 * 
 * @author DW
 *
 */
public class People implements InvocationHandler
{
	private Object object;
	
	public People(Object object)
	{
		this.object = object;
	}
	
	/**
	 * 動態接受不同的真實角色對象
	 * @param object
	 */
	public void setObject(Object object)
	{
		this.object = object;
	}
	
	public static Object factory(Object object)
	{
		InvocationHandler handler = new People(object);
		
		// 動態生成一個代理
		return  Proxy.newProxyInstance(object.getClass().getClassLoader(),	// 真實對象的類加載器
										object.getClass().getInterfaces(),	// 真實對象實現的所有接口(數組)
										handler	// 代理對象, 
										);
	}
	
	/**
	 * 代理角色類實現了InvocationHandler接口的invoke方法, 當factory方法每次調用后, 都動態生成一個代理實例, 
	 * 當該代理實例引用在外部調用working()方法時, 實際都是在調用本方法; 並通過java底層傳參利用反射機制, 將該代
	 * 理角色接收的真實角色的working方法通過參數2傳遞進來, working方法的參數則通過參數3傳遞進來...
	 * 
	 */
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
	{
		// 實際形態:handler引用指向的代理角色對象接受的真實用戶的working方法
		return method.invoke(this.object, args);
	}
	
}

  


package com.DynamicProxy3;

/**
 * 動態代理: 測試
 * 
 * @author DW
 *
 */
public class DynamicProxyTest
{
	public static void main(String[] args)
	{
		DoSomething doSomething = (DoSomething)People.factory(new Man("張三"));
		doSomething.working("狩獵"); // 張三在狩獵
		
		doSomething = (DoSomething)People.factory(new Man("李四"));
		doSomething.working("劈柴");	// 李四在劈柴
		
		doSomething = (DoSomething)People.factory(new Woman("翠花"));
		doSomething.working("做酸菜"); //	 翠花在做酸菜
	}
}

  


免責聲明!

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



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