版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33621967/article/details/53088445
代理模式
造代理对象的工具类:
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();
}
}