迟来的学习记录——代理模式

本文深入讲解Java代理模式,包括静态代理、动态代理及子类代理cglib的基本概念、实现原理和代码实例。通过购买家乡特产的故事,生动展示了代理模式在实际场景中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

新年好啊,讲代理模式前,先讲个简单有趣的软件应用——Android快应用

如下图,应用市场搜索快应用,目前了解的只支持各大厂商的应用市场中打开。
在这里插入图片描述
打开之后我们可以看到很多App应用。
在这里插入图片描述

这些App应用都是可以无需安装打开即用的,网页加载比小程序快超多的。

对比图我借来了,很多生活软件是无需安装的,手机内存不足的可以用用Android快应用哦。
在这里插入图片描述
好了讲代理模式了

java代理模式——静态代理

先模拟个故事,比如我现在在杭州但是想买点家乡的特产,这个时候我是回不去了,但是有个同事要回家一趟还是我老乡,这个时候我是不是可以叫他帮我带一下。ok。
我们给老乡他取个名字叫老王。
下面开始代码。
我们的行为是不是买特产,这个行为我们叫购买。

1.创建Shop接口
public interface Shop {
    void buy();//购买的方法
}
2.创建ShiYuTian类
public class ShiYuTian implements Shop {
    @Override
    public void buy() {
        System.out.println("购买了****");//为啥是****,这个男人吗你懂得,你们想歪别怪我
    }
}
3.创建LaoWang类
public class LaoWang implements Shop{
    private Shop shop;
    public LaoWang(Shop shop){
        this.shop=shop;
    }
    @Override
    public void buy() {
        shop.buy();
    }
}
4.客户端买特产了
public class Client {
    public static void main(String[] args) {
        Shop shiyutian=new ShiYuTian();
        Shop laowang=new LaoWang(shiyutian);//老王去帮我买,嘻嘻
        laowang.buy();
    }
}
5.结果

在这里插入图片描述
东西是不是到手了,嘻嘻,静态代理模式就是这样。

java代理模式——动态代理

注意拉,老王现在不在了,但是我是个死都胖不了的瘦子,必须要吃家乡特产,怎么办,我直接百度购买****,网上购物不香吗?,这个是我不知道是谁啊帮买家乡特产的情况,我们叫动态代理。
上代码。

1.创建Shop接口
public interface Shop {
    void buy();//购买的方法
}
2.创建ShiYuTian类
public class ShiYuTian implements Shop {
    @Override
    public void buy() {
    }
}
3.创建Stranger类,这个网上购物我们叫陌生人购物,注意这不是对象
public class Stranger implements InvocationHandler{
    private Object object;
    public Stranger(Object object){
        this.object=object;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result=method.invoke(object,args);
        if(method.getName().equals("buy")){
            System.out.println("ShiYuTian在买****");
        }
        return null;
    }
}
4.创建Client 实现动态代理购物
/*
 * newProxyInstance方法的三参数
 * ClassLoader loader:指定当前目标对象使用类加载器,获取加载器的方法是固定的
 * Class<?>[] interfaces:目标对象实现的接口的类型,使用泛型方式确认类型
 * InvocationHandler h:事件处理,执行目标对象的方法时,会触发事件处理器的方法,会把当前执行目标对象的方法作为参数传入
 */
public class Client {
    public static void main(String[] args) {
          Shop shiyutian=new ShiYuTian();//创建对象
          Stranger stranger=new Stranger(shiyutian);
          ClassLoader loader=shiyutian.getClass().getClassLoader();
          Shop shop= (Shop) Proxy.newProxyInstance(loader,new Class[]{Shop.class},stranger);
          shop.buy();//动态代理是在运行时创建对象,然后去购物,静态代理是直接老王去买了
    }
}

java代理模式——子类代理cglib

类似cglib框架 在Android中是MethodInterceptProxy框架 ,Android当中是不能使用cglib的,cglib不支持Android平台,这个就抱歉了,我就不分享了。

总结

上两种的不同点是

  1. 静态代理是通过在代码中显式定义一个业务实现类一个代理,在代理类中对同名的业务方法进行包装.用户通过代理类调用包装过的业务方法。
    在这里插入图片描述
  2. jdk动态代理是通过接口中的方法名,在动态生成的代理类中调用业务实现类的同名方法。
    在这里插入图片描述
记录的同时,希望能够帮到你,下次见
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值