您的位置:首页 > 其它

代理模式通用模板实现

2016-11-08 21:07 246 查看
代理模式

造代理对象的工具类:

package cn.hncu.proxy.util;

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

public class ProxyUtils implements InvocationHandler{
private Object obj=null;
public ProxyUtils(Object obj){
this.obj = obj;
}

public static Object getProxy( Object obj){
Object newObj = Proxy.newProxyInstance(
ProxyUtils.class.getClassLoader(),
obj.getClass().getInterfaces(),
new ProxyUtils(obj)); //构造传参
return newObj;
}

@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
if(a!=null){
a.before();
}
System.out.println("前面拦拦:"+method.getName());

Object returnObj = method.invoke(obj, args);

System.out.println("后面拦拦:"+method.getName());
if(a!=null){
a.after();
}

return returnObj;
}

//////////////////////////
public Object getProxy( ){
Object newObj = Proxy.newProxyInstance(
ProxyUtils.class.getClassLoader(),
obj.getClass().getInterfaces(),
this);
return newObj;
}

private A a;
public void addXXXListener( A a ){
this.a = a;
}

}

interface A {
public void before();
public void after();
}


演示的代码:

package cn.hncu.proxy.util;

public class Dog implements IDog {
private String name;
public Dog() {
this.name = "小布丁";
}
@Override
public void run(){
System.out.println(name+" 正在跑...");
}
}


package cn.hncu.proxy.util;

public interface IDog {

public abstract void run();

}


package cn.hncu.proxy.util;

public class Person implements IPerson {
private String name;
public Person(String name) {
this.name = name;
}
/* (non-Javadoc)
* @see cn.hncu.proxy.util.IPerson#sayHello()
*/
@Override
public void sayHello(){
System.out.println("My Name is: "+name);
}
}


package cn.hncu.proxy.util;

public interface IPerson {
public abstract void sayHello();
}


实现类:

package cn.hncu.proxy.util;

import org.junit.Test;

public class Client {

@Test
public void test(){
Person p = new Person("张三");

IPerson p2= (IPerson) ProxyUtils.getProxy(p);
p2.sayHello();

Dog dog = new Dog();
IDog d2 =   (IDog) ProxyUtils.getProxy(dog);

d2.run();

}

@Test//引入监听者模式
public void test2(){
Person p = new Person("张三");
ProxyUtils proxy = new ProxyUtils( p );
proxy.addXXXListener(new A() {
@Override
public void before() {
System.out.println("你好,帮你设置编码");
}
@Override
public void after() {
System.out.println("再见,资源收回来");
}
});
IPerson p2= (IPerson) proxy.getProxy();
p2.sayHello();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  对象 class