现在的位置: 首页 > 综合 > 正文

代理模式

2013年10月09日 ⁄ 综合 ⁄ 共 1809字 ⁄ 字号 评论关闭

所谓代理模式,就是给某一对象提供代理对象,并由代理对象控制具体对象的应用

 

代理模式设计的角色:

1、抽象角色:声明了代理主题和真实主题的公共接口,使任何需要真实主题的地方都能用代理主题代替

2、代理角色:含有真实主题的引用,从而可以在任何时候操作真实主题,代理主题功过提供和真实主题相同的接口,使它可以随时代替真实主题.代理主题通过持有真实主题的引用,不但可以控制真实主题的创建或删除,可以在真实主题被调用前进行拦截,或在调用后进行某些操作.

3、真实角色:定义了代理角色所代表的具体对象

 

现在写一个关于静态代理的例子:

1、抽象角色

/**
 * 抽象角色,提供了代理角色和真实角色的共同接口
 * @author Administrator
 *
 */
public interface SubObject
{
	public void request();
}

2、真实角色

/**
 * 真实角色实现了抽象角色这个接口
 * @author Administrator
 *
 */
public class RealSubObject implements SubObject
{
	@Override
	public void request()
	{
		// TODO Auto-generated method stub
		System.out.println("RealSubObject 's request方法执行了...");
	}

}

3、代理角色

public class MyProxy implements SubObject
{
	private SubObject sub;
	public MyProxy(SubObject sub)
	{
		this.sub=sub;
	}
	
	@Override
	public void request()
	{
		this.predo();
		sub.request();
		this.afterdo();
	}
	
	public void predo()
	{
		System.out.println("代理执行之前.....");
	}
	
	public void afterdo()
	{
		System.out.println("代理执行之后.....");
	}
}

 

4、测试方法

public class ProxtTest
{
	public static void main(String[] args)
	{
		RealSubObject real=new RealSubObject();
		MyProxy proxy=new MyProxy(real);
		proxy.request();
	}
}

以上便是一个简单的代理模式

 

下面在编写一个动态代理的例子:

1、抽象角色(同上)

2、真实角色(同上)

3、代理角色

public class MyInvocationHandler implements InvocationHandler
{

	private Object obj;
	
	public MyInvocationHandler(Object obj)
	{
		this.obj=obj;
	}
	
	public  Object factory()
	{
		Object proxy=null;
		
		proxy=Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);
		return proxy;
	}
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable
	{
		// TODO Auto-generated method stub
		this.predo();
		Object res=method.invoke(obj, args);
		this.afterdo();
		return res;
	}
	
	public void predo()
	{
		System.out.println("代理执行之前...");
	}
	
	public void afterdo()
	{
		System.out.println("代理执行之后...");
	}
	
	public static void main(String[] args)
	{
		RealSubObject sub=new RealSubObject();
		MyInvocationHandler handler=new MyInvocationHandler(sub);
		SubObject obj=(SubObject)handler.factory();
		obj.request();
	}

}

 

 

 

 

抱歉!评论已关闭.