今天温故了下动态代理设计模式,顺便写了写笔记,对动态代理添加了些自己的一些想法
以下是一些类的依赖关系
通过上面的动态代理工厂生成任何你需要的代理对象,并传入任何你想要的处理,所以设计了两个接口,如上图所示
下面是动态代理工厂,(这里同时用了静态工厂设计模式)通过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
通过以上的实例,可以轻松的生成任意动态代理对象,并融入自己的处理类,方便实现自己的业务逻辑!!!