码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式之代理模式

时间:2015-08-14 21:36:37      阅读:219      评论:0      收藏:0      [点我收藏+]

标签:设计模式   代理模式   动态代理   


1 代理模式:就是一个类被另外一个类代替来执行某个方法,使得执行原来的方法的时候增加一些业务逻辑处理。

2 动态代理:通过反射技术,在运行过程进行代理的代理模式。

3 区别:静态代理:在程序编译时候,就已经形成代理类。

              动态代理:利用反射技术实现,在程序运行时候才能得到代理类。

4 动态代理分为需要实现接口和不需要实现接口两种:

         被代理类实现接口的时候可以用 反射包下的InvocationHandler和Proxy实现生成代理;

         被代理类没有实现接口,此时之前的方式就不可以用了,需要cglib生成二进制码,来获取代理类。

5 基于反射情况的动态代理模式:


接口:

package com.in;

public interface Hello {
	public void say();
}


实现类:

package com.in;

public class HelloImpl implements Hello{

	@Override
	public void say() {
		System.out.println("in hello");
		
	}

}

代理类:

package com.in;

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

public class HelloProxy implements InvocationHandler{
	private Object obj;
	public HelloProxy(Object obj){
		this.obj=obj;
	}
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		Object result=null;
		before();
		method.invoke(obj, args);
		after();
		return result;
	}
	
	public void before(){
		System.out.println("in before");
	}
	
	public void after(){
		System.out.println("in after");
	}

}
说明:声明一个被代理类型的属性,通过构造方法实例化。method.invoke(被代理对象,参数)。


测试类:

package com.in;

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

public class Test {

	public static void main(String[] args) {
		Hello hello=new HelloImpl();
		InvocationHandler proxy=new HelloProxy(hello);		
		Hello h=(Hello) Proxy.newProxyInstance(hello.getClass().getClassLoader(), hello.getClass().getInterfaces(), proxy);
		h.say();
	}

}
说明:Proxy生成被代理对象。









设计模式之代理模式

标签:设计模式   代理模式   动态代理   

原文地址:http://blog.csdn.net/liangwenmail/article/details/47666407

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!