GOF设计模式-代理模式

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

这里写图片描述

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

来一个代理买车的例子

首先要有个买车的抽象类

public interface BuyCar {

    public void getCar();

}

真实要买车的对象

public class My implements BuyCar{

    @Override
    public void getCar() {
        System.out.println("我:我购买了一辆车");
    }
}

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

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("代理:代购完成,车辆已经交给客户");
    }
}

来个测试类,测一下

public class Test {

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

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

动态代理

上面说的是静态代理,在代码运行前就已经存在了代理类的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;
    }
}

测试类:

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();
    }
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值