读书人

动态署理小小进阶

发布时间: 2012-10-29 10:03:53 作者: rapoo

动态代理小小进阶

?

?? 今天温故了下动态代理设计模式,顺便写了写笔记,对动态代理添加了些自己的一些想法

??以下是一些类的依赖关系


动态署理小小进阶

通过上面的动态代理工厂生成任何你需要的代理对象,并传入任何你想要的处理,所以设计了两个接口,如上图所示

下面是动态代理工厂,(这里同时用了静态工厂设计模式)通过getproxy方法获得代理对象

package Factory;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//动态代理工厂
public class ProxyFactory {
?
?private ProxyFactory() {

?}
/**
?*
?* @param o
?* @param handler? 动态代理类的动态处理类
?* @return
?*/
?public static Object getproxy(final Object o,final Handler handler) {
??InvocationHandler objhandler = new InvocationHandler() {
???@Override
???public Object invoke(Object proxy, Method method, Object[] args)
?????throws Throwable {
????handler.handbefore();
????method.invoke(o, new Object[] {});
????handler.handafter();
????return null;
???}
??};
??return Proxy.newProxyInstance(ProxyFactory.class.getClassLoader(), o
????.getClass().getInterfaces(), objhandler);
?}


}
下面是被代理对象接口

package Factory;

public interface Role {

?

public void? sayHello();?
?
?
}

下面是被被代理对象

package Factory;

public class RoleImpl implements Role {

?@Override
?public void sayHello() {
?
??System.out.println("RoleImpl------->sayhello");

?}

}

?

下面是被代理对象的接口

package Factory;

public interface Handler {
public void handbefore();
public void handafter();
}

下面是被代理对象1

?

package Factory;

public class FirstHandler implements Handler {

?@Override
?public void handbefore() {
?
??System.out.println("this is my FirstHandler------->before");

?}

?@Override
?public void handafter() {
??
??System.out.println("this is my FirstHandler------->after");
?}

}
?

下面是被代理对象2

package Factory;

public class SecondHandler implements Handler {

?@Override
?public void handbefore() {
?
??System.out.println("this is my SecondHandler------->before");

?}

?@Override
?public void handafter() {
??
??System.out.println("this is my SecondHandler------->after");
?}

}

下面是测试类

package Factory;

public class Test {

?/**
? * @param args
? */
?public static void main(String[] args) {
??Role role=new RoleImpl();
??Handler? handler1=new FirstHandler();
??Handler? handler2=new SecondHandler();
??Role? ro=(Role)ProxyFactory.getproxy(role, handler1);
??ro.sayHello();
??ro=(Role)ProxyFactory.getproxy(role, handler2);
??????? ro.sayHello();
?}

}

?

测试类打印的结果是

?

this is my FirstHandler------->before
RoleImpl------->sayhello
this is my FirstHandler------->after
this is my SecondHandler------->before
RoleImpl------->sayhello
this is my SecondHandler------->after

通过以上的实例,可以轻松的生成任意动态代理对象,并融入自己的处理类,方便实现自己的业务逻辑!!!

?

?

读书人网 >编程

热点推荐