Java 23种设计模式之代理模式

来源:互联网 发布:虹越400官网和淘宝店 编辑:程序博客网 时间:2024/06/05 20:04

代理模式就是多一个代理类出来,替原对象进行一些操作,比如我们在租房子的时候回去找中介,为什么呢?因为你对该地区房屋的信息掌握的不够全面,希望找一个更熟悉的人去帮你做,此处的代理就是这个意思。
代理模式分为三种

  1. 静态代理
  2. 动态代理
  3. cglib代理

1. 创建一个实体类

public class Person implements Personable{    @Override    public void eat() {        System.out.println("eat 吃饭");    }}

2. 定义一个接口

public interface Personable {    void eat();}

3. 静态代理实现
持有该对象的引用 实现接口方法 调用该对象的方法

public class StaticProxy implements Personable{    private Person p;    public StaticProxy(){        p = new Person();    }    @Override    public void eat() {        System.out.println("刷牙洗脸打豆豆");        p.eat();        System.out.println("洗澡睡觉抱媳妇");    }}

4. 动态代理实现

/** * Created by Administrator on 2017/8/6. * 创建动态代理对象 * 动态代理不需要实现接口,但是需要指定接口类型 */public class DynamicProxy {    //维护一个目标对象    private Object target;    public DynamicProxy(Object target){        this.target = target;    }    //给目标对象生成代理对象    public Object getProxy(){        return Proxy.newProxyInstance(                target.getClass().getClassLoader(),                target.getClass().getInterfaces(),                new InvocationHandler() {                    @Override                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {                        System.out.println("刷牙洗脸打豆豆");                        Object invoke = method.invoke(target, args);                        System.out.println("洗澡睡觉抱媳妇");                        return invoke;                    }                }        );    }}

5. cglib代理实现
需要加入一个cglib-nodep-2.2.jar的架包

/** * Created by Administrator on 2017/8/6. * 目标对象 不需要实现接口 */public class User {    public void eat(){        System.out.println("eat 吃饭");    }}//cglib代理类public class CglibProxy implements MethodInterceptor {    //维护目标对象    private Object target;    public CglibProxy(Object target){        this.target = target;    }    //给目标对象创建一个代理对象    public Object getProxyInstance(){        //工具类        Enhancer enhancer = new Enhancer();        //设置父类        enhancer.setSuperclass(target.getClass());        //设置回调函数        enhancer.setCallback(this);        //创建代理对象        return enhancer.create();    }    @Override    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {        System.out.println("刷牙洗脸打豆豆");        //执行目标对象方法        Object invoke = method.invoke(target, objects);        System.out.println("洗澡睡觉抱媳妇");        return invoke;    }}

6. 测试类

public class ProxyTest {    //静态代理    @Test    public void test1(){        Personable proxy = new StaticProxy();        proxy.eat();    }    //动态代理    @Test    public void test2(){        Personable p = new Person();        System.out.println(p.getClass());        //不能传Person对象 需要指定接口类型Personable         Personable p1 = (Personable) new DynamicProxy(p).getProxy();        System.out.println(p1.getClass());        p1.eat();    }    //cglib代理    @Test    public void test3(){       Person p = new Person();       System.out.println(p.getClass());       Person p1 = (Person) new CglibProxy(p).getProxyInstance();       System.out.println(p1.getClass());       p1.eat();    }}
原创粉丝点击