欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

Java代理模式,

来源: javaer 分享于  点击 20728 次 点评:68

Java代理模式,


本文将从以下几个方面进行阐述:


静态代理:
其类图如下:

真实角色与代理类同时实现一个接口,真实角色只处理与它核心业务相关的,其他的全部由代理角色完成。

/**
 * 抽象接口
 * @author sg
 */
public interface Subject {
   void printBeforeLogging();
   void operation();
   void printAfterLogging();
}
//真实角色
public class RelSubject implements Subject{
	@Override
	public void printBeforeLogging() {
		System.out.println("RelSubject printBeforeLogging");
	}

	@Override
	public void operation() {
		System.out.println("RelSubject operation");
	}

	@Override
	public void printAfterLogging() {
		System.out.println("RelSubject printAfterLogging");
	}
}
//代理角色
public class Proxy implements Subject{
    private Subject subject;
    
	public Proxy(Subject subject) {
		super();
		this.subject = subject;
	}

	@Override
	public void printBeforeLogging() {
		System.out.println("Proxy printBeforeLogging");	
	}

	@Override
	public void operation() {
		//真实的角色来完成
		subject.operation();
	}

	@Override
	public void printAfterLogging() {
		System.out.println("Proxy printAfterLogging");
	}
}
//客户端代码
public class Client {
    public static void main(String[] args) {
    	Subject subject=new RelSubject();
    	Subject proxy=new Proxy(subject);
    	proxy.printBeforeLogging();
    	proxy.operation();
    	proxy.printAfterLogging();
	}
}

Proxy printBeforeLogging
RelSubject operation
Proxy printAfterLogging


动态代理

public interface Calculate {
    void operate();
}

public class CalculateImpl implements Calculate{
	@Override
	public void operate() {
		System.out.println("Operating");	
	}
}
//代理类
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class DynamicProxy implements InvocationHandler{
	//目标对象
    private Object target;
    public DynamicProxy(Object target){
    	this.target= target;
    }
    public Object getProxy(){
    	//调用Proxy的静态方法
    	return 
    Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
    			target.getClass().getInterfaces(), this);
    }
    
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		Object result = method.invoke(target, args);
		return result;
	}
}
//客户端
public class Client {
    public static void main(String[] args) {
		 Calculate target=new CalculateImpl();
		 Calculate proxy = (Calculate)new DynamicProxy(target).getProxy();
		 proxy.operate();
	}
}

cglib代理实现
首先下载所必须Jar包:cglib

public class CglibProxyFactory implements MethodInterceptor {
	private Object target;

	public CglibProxyFactory(Object target) {
		super();
		this.target = target;
	}

	public Object myCglibLogging() {
		Enhancer enhancer = new Enhancer();
		// 生成得代理类对象为该类的子类
		enhancer.setSuperclass(target.getClass());
		enhancer.setCallback(this);
		return enhancer.create();
	}

	/**
	 * 调用动态方法的时候会调用此方法
	 */
	@Override
	public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
		Object result = method.invoke(target, args);
		System.out.println(method);
		return result;
	}
}
//测试
public class CglibProxyTest {
	public static void main(String[] args) {
		CglibProxyTest ct=new CglibProxyTest();
		CglibProxyTest myCglibLogging = (CglibProxyTest) new CglibProxyFactory(ct).myCglibLogging();
		myCglibLogging.run();
	}
	
	public void run(){
		System.out.println("running");
	}
}

总结:
基于接口的代理方式的缺点为所要代理的应该实现接口,而基于cglib的代理如果定义为final也是无法实现的了。
更多相关文章可参考:
JDK动态代理实现原理详细分析

相关文章

    暂无相关文章
相关栏目:

用户点评