Android 代理模式

作者: Yink_Liu | 来源:发表于2019-01-23 15:26 被阅读8次

Android 设计模式系列文章 Android 23种设计模式

前言

代理模式可能是我们平时开发中最常见的模式之一了。顾名思义,代理模式主要体现在代理二字上。比如我们买房的时候,通常我们会找一个中介。而这个中介就是一个代理的角色。那么代理模式在代码上的体现就是通过代理类来控制访问需要被代理的类。

代理模式定义

为其他对象提供一种代理以控制这个对象的访问。

代理模式举例

Android中的代理模式十分常见,根据代码来归类。主要分为静态代理模式和动态代理模式。

1、静态代理

静态代理很好理解就是我们需要编写一个代理类。实现我们需要代理的所有方法。所以称之为静态代理。由于需要代理的方法可能有很多。为了约束代理类和被代理类这些相同的方法,所以写一个接口来继承是最直观的方式,当然这个接口不是必须的,可加可不加。都不影响,主要是理解代理这个设计模式的思想。代理模式的变化也很多。

public interface ProxyInterface {
    void choiceBetterHouse(); //模拟挑选优质房子
    void buyHouse(); //模拟买房子
}

然后我们定义一个叫Petter的人

public class Petter implements ProxyInterface {
    private static final String TAG = Petter.class.getSimpleName();

    @Override
    public void choiceBetterHouse() {
        Log.d(TAG,"挑选优质房子");
    }

    @Override
    public void buyHouse() {
        Log.d(TAG,"买房子");
    }
}

然后定义代理类

public class StaticProxy implements ProxyInterface {
    private Petter petter;

    public StaticProxy(Petter petter) {
        this.petter = petter;
    }

    @Override
    public void choiceBetterHouse() {
        petter.choiceBetterHouse();
    }

    @Override
    public void buyHouse() {
        petter.buyHouse();
    }
}

然后就是调用

        Petter petter = new Petter();
        StaticProxy agency = new StaticProxy(petter);
        agency.choiceBetterHouse();
        agency.buyHouse();

输出这里就不打印了。静态代理就是这么简单。就是代理petter挑选优质房子,买房子。卖家接触的都是中介,真正执行和做决定的是Petter。现实代码中我们见得多的也就是这种代理了。

2、动态代理

动态代理和静态代理的区别就是动态代理不用我们去手动编写代理类。动态代理就是JDK提供的机制,可在内存中动态的生成代理类。
例子还是上面的例子,我们重新编写动态代理类

public class DynamicProxy implements InvocationHandler {
    private static final String TAG = DynamicProxy.class.getSimpleName();
    private Object object;

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

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Log.d(TAG,"invoke");
        Object result = method.invoke(object,args);
        return result;
    }
}

动态代理的核心就是继承InvocationHandler这个接口,通过method的invoke方法来间接调用原本的方法。这里和java反射调用方法的时候一样。
然后我们看客户端是如何调用的

        Petter petter = new Petter();
        // 返回一个代理对象
        ProxyInterface proxyPetter = (ProxyInterface) Proxy.newProxyInstance(
                petter.getClass().getClassLoader(),
                petter.getClass().getInterfaces(),
                new DynamicProxy(petter));
        proxyPetter.choiceBetterHouse();
        proxyPetter.buyHouse();

这里就是最关键的一步了,Proxy.newProxyInstance来生成一个代理对象。通过这个代理对象就可以调用需要被代理的方法了。我们来看输出

01-23 11:40:14.169 18725-18725/com.yink.designpattern.designpattern D/DynamicProxy: invoke
01-23 11:40:14.169 18725-18725/com.yink.designpattern.designpattern D/Petter: 挑选优质房子
01-23 11:40:14.169 18725-18725/com.yink.designpattern.designpattern D/DynamicProxy: invoke
01-23 11:40:14.169 18725-18725/com.yink.designpattern.designpattern D/Petter: 买房子

好了,动态代理模式就这点儿东西了。比较的时候,注意对比StaticProxy、DynamicProxy的代码就可以了。

写在最后

1、通常我们见得最多的就是静态代理模式,静态代理模式目的也很明确,代理需要代理的方法即可
2、代理模式是一种比较简单的模式,通常我们使用的时候往往夹杂着其他比较复杂的知识。比如Android源码中,系统各种Service服务框架跨进程使用binder调用的时候就使用代理模式。这里就不扩展开了,有兴趣的同学可以看下我另一篇文章 PackageManagerService服务框架详解
3、虽然代理模式是一种相对简单的模式,但它十分重要。学设计模式主要理解它的理念,知道使用它的优点。自然做到心中有数。不然就是知其然不知其所以然。

相关文章

  • 【设计模式Android】中介者模式

    设计模式Android 其他相关文章:【设计模式Android】设计模式六大原则【设计模式Android】代理模式...

  • 动态代理原理解析

    注:源自于Android 一、代理模式 代理模式是java23种设计模式常用的一种设计模式。代理模式是客户端不直接...

  • Android学习笔记——代理模式到动态代理

    标签: Android 代理模式 在代理模式中一般有三个成员:服务接口,被代理对象(提供实际服务功能),代理对象(...

  • Android 代理模式

    Android 设计模式系列文章 Android 23种设计模式 前言 代理模式可能是我们平时开发中最常见的模式之...

  • Java代理模式及三种方式

    导读 移动开发知识体系总章(Java基础、Android、Flutter) 代理模式简介 Java的三种代理模式 ...

  • 代理模式

    本文参考《Android源码设计模式解析与实战第2版》 代理模式的定义 代理模式也称为委托模式,是为其他对象提供代...

  • 代理模式(Proxy Pattern):动态代理 - 最易懂的设

    前言 今天我来全面总结Android开发中最常用的设计模式 - 代理模式中的动态代理模式 其他设计模式介绍1分钟全...

  • 2021-03-19

    【Android设计模式】从Retrofit看懂动态代理模式 - 简书[https://www.jianshu.c...

  • Android 代理模式

    <<1.0 普通代理>> 前言:通过打游戏的例子来分析普通代理模式的原理,打游戏的过程无非就是打怪升级,那么把这一...

  • [Android] 代理模式

    代理模式是什么 如上图所示,代理代表着另一终端中的某个真实服务对象,Client 调用代理(Client help...

网友评论

    本文标题:Android 代理模式

    本文链接:https://www.haomeiwen.com/subject/lfwljqtx.html