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

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

如下图,应用市场搜索快应用,目前了解的只支持各大厂商的应用市场中打开。
迟来的学习记录——代理模式_第1张图片
打开之后我们可以看到很多App应用。
迟来的学习记录——代理模式_第2张图片

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

对比图我借来了,很多生活软件是无需安装的,手机内存不足的可以用用Android快应用哦。
迟来的学习记录——代理模式_第3张图片
好了讲代理模式了

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.结果

迟来的学习记录——代理模式_第4张图片
东西是不是到手了,嘻嘻,静态代理模式就是这样。

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. 静态代理是通过在代码中显式定义一个业务实现类一个代理,在代理类中对同名的业务方法进行包装.用户通过代理类调用包装过的业务方法。
    迟来的学习记录——代理模式_第5张图片
  2. jdk动态代理是通过接口中的方法名,在动态生成的代理类中调用业务实现类的同名方法。
    迟来的学习记录——代理模式_第6张图片
记录的同时,希望能够帮到你,下次见

你可能感兴趣的:(设计模式)