代理模式通用模板实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 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();
    }

}

猜你喜欢

转载自blog.csdn.net/qq_33621967/article/details/53088445