`

设计模式之-代理模式-Proxy

 
阅读更多

使用代理模式之前需要知道代理模式能做什么? 能有哪些好处以及为什么要用代理模式.

 

Proxy模式又叫做代理模式,是构造型的设计模式之一,它可以为其他对象提供一种代理(Proxy)

以控制对这个对象的访问。所谓代理,是指具有与代理元(被代理的对象)具有相同的接口的类,客户端必须通过代理与被代理的目标类交互,而代理一般在交互的过程中(交互前后),进行某些特别的处理

 

下面是一个动态代理的实例:

package pack.java.proxy;
/**
 * 主题接口;
 * @ClassName: Subject 
 * @Description: TODO(这里用一句话描述这个类的作用) 
 * @author Administrator
 * @date 2015-4-28
 *
 */
public interface Subject {
	/**
	 * 业务处理方法;
	 * @Title: process 
	 * @Description: TODO(这里用一句话描述这个方法的作用) 
	 * @Params
	 * @throws
	 */
	String process();
}

 

建立一个实现接口的方法:

package pack.java.proxy;
/**
 * 实现主题接口
 * @ClassName: RealSubject 
 * @Description: TODO(这里用一句话描述这个类的作用) 
 * @author Administrator
 * @date 2015-4-28
 *
 */
public class RealSubject implements Subject{
	@Override
	public String process() {
		before();
		System.out.println("业务处理核心方法");
		after();
		return "处理方法.";
	}
	
	private void before(){
		System.out.println("业务处理之前需要执行的方法.");
	}
	
	private void after(){
		System.out.println("业务处理之后需要执行的方法.");
	}
}

 

建立一个用于代理处理类:

package pack.java.proxy;

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

/**
 * 动态代理;
 * @ClassName: ProxyHander 
 * @Description: TODO(这里用一句话描述这个类的作用) 
 * @author zhouhaitao
 * @date 2015-4-28
 *
 */
public class ProxyHander implements InvocationHandler {
	private Subject subject;
	
	public void setSubject(Subject subject) {
		this.subject = subject;
	}
	
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		//动态调用;
		Object obj =  method.invoke(subject, args);
		return obj;
	}
}

 

建立一个测试类,用于测试结果:

package pack.java.proxy;
import java.lang.reflect.Proxy;

public class MainClass {

	/** 
	 * @Title: main 
	 * @Description: TODO(这里用一句话描述这个方法的作用) 
	 * @Params
	 * @throws 
	 */
	public static void main(String[] args) {
		ProxyHander proxyHander = new ProxyHander();
		Subject subject = new RealSubject();
		//设置要代理的对象;
		proxyHander.setSubject(subject);
		//实例化代理类;
		Subject sub = (Subject)Proxy.newProxyInstance(RealSubject.class.getClassLoader(),RealSubject.class.getInterfaces(),proxyHander);
		String str = sub.process();
		System.out.println("返回结果:"+str);
	}

}

 

结果如下:

业务处理之前需要执行的方法.

业务处理核心方法

业务处理之后需要执行的方法.

返回结果:处理方法.

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics