当前位置:   article > 正文

GOF设计模式-代理模式_gof 代理模式 动态代理

gof 代理模式 动态代理

代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

这里写图片描述

  • Subject:抽象主题类,声明真实主题与代理的共同接口方法。
  • RealSubject:真实主题类,定义了代理所表示的真实对象,客户端通过代理类间接的调用真实主题类的方法。
  • ProxySubject:代理类,持有对真实主题类的引用,在其所实现的接口方法中调用真实主题类中相应的接口方法执行。
  • Client:客户端类。

来一个代理买车的例子

首先要有个买车的抽象类

public interface BuyCar {

    public void getCar();

}
  • 1
  • 2
  • 3
  • 4
  • 5

真实要买车的对象

public class My implements BuyCar{

    @Override
    public void getCar() {
        System.out.println("我:我购买了一辆车");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

代理,代替真实对象买车的,要持有真实对象的资料,不然就真成自己买车了

public class ProxyMy implements BuyCar{

    private BuyCar buyCar; // 一定要持有真实对象

    public ProxyMy(BuyCar buyCar) {
        this.buyCar = buyCar;
    }

    @Override
    public void getCar() {
        System.out.println("代理:我是代购,我帮别人代购一辆车");
        buyCar.getCar();
        System.out.println("代理:代购完成,车辆已经交给客户");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

来个测试类,测一下

public class Test {

    public static void main(String[] args) {
        BuyCar my = new My();
        BuyCar buyCar = new ProxyMy(my);
        buyCar.getCar();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

代理模式,就是在代理类中持有一个真实类(被代理类)的对象,真正被调用的,还是真实类,就像上面,真实买车的,还是我,而实际买车的确实代理人,这样的话,代理人就可以在中间抽点利润什么的,我也免去了一些来回奔跑的麻烦。

动态代理

上面说的是静态代理,在代码运行前就已经存在了代理类的class编译文件,而动态代理则是在代码运行时通过反射来动态的生成代理类的对象,并确定到底来代理谁。spring 的核心功能之一就是 aop,就是动态代理。

Java提供了动态的代理接口InvocationHandler,实现该接口需要重写invoke()方法。

创建动态代理类

public class DynamicProxy implements InvocationHandler {

    private Object obj;

    public DynamicProxy(Object obj) {
        this.obj = obj;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("代理:我是代购,我帮别人代购一辆车");
        Object result=method.invoke(obj, args);
        System.out.println("代理:代购完成,车辆已经交给客户");
        return result;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

测试类:

public class Test {

   /* public static void main(String[] args) {
        BuyCar my = new My();
        BuyCar buyCar = new ProxyMy(my);
        buyCar.getCar();
    }*/

    public static void main(String[] args) {
        BuyCar my = new My();
        DynamicProxy dynamicProxy = new DynamicProxy(my);

        ClassLoader classLoader = my.getClass().getClassLoader();
        BuyCar buyCar = (BuyCar) Proxy.newProxyInstance(classLoader, new Class[]{BuyCar.class}, dynamicProxy);
        buyCar.getCar();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

代码地址:https://github.com/mazh1992/model/

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/562311
推荐阅读
相关标签
  

闽ICP备14008679号