Android 设计模式 - 代理模式

作者: Android架构 | 来源:发表于2019-02-21 21:19 被阅读2次

1.定义

给某一个对象提供一个代 理,并由代理对象控制对原对象的引用,它是一种对象结构型模式。

2. 作用

在某些情况下,客户不想或者不能直接引用一个对象,此时可以通过一个称之为「代理」的第三者来实现间接引用。代理对象可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象去掉客户不能看到的内容和服务,或者添加客户需要的额外服务。

3. 角色

  • 抽象主题角色:声明了真实主题和代理主题的共同接口;
  • 代理主题角色:内部包含对真实主题的引用,可以在任何时候操作真实主题对象;
  • 真实主题角色:定义代理角色所代表的真实对象,在真实主题角色中实现真实的业务操作,客户端可以通过代理主题角色间接调用真实主题角色中定义的方法。

4. 实现

一到节假日,火车票就十分难买,于是各种抢票软件盛行。我们把信息交给服务商,然后软件帮我们日夜不停地刷票,最后大概率会抢到车票。在这里,提供抢票服务的人就是代理对象,帮助买票人抢票获得佣金。买票的人是被代理对象,具有真实的购票需求。

下面就以抢票的例子来说明代理模式的使用。

代理的实现分为:

  • 静态代理:代理类是在编译时完成的。也就是说 Java 编译完成后代理类是一个实际的 class 文件。
  • 动态代理:代理类是在运行时生成的。也就是说 Java 编译完之后并没有实际的 class 文件,而是在运行时动态生成的类字节码,并加载到 JVM 中。
类图

首先来看静态代理,这个比较容易理解。

  1. 定义抽象主题角色。
public interface ITicketBuyer {
    /**
     * 买票
     */
    void buyTicket();
}

  1. 定义真实主题角色,即需要买票的人。
public class RealBuyer implements ITicketBuyer {

    @Override
    public void buyTicket() {
        System.out.println("我要一张北京到上海的复兴号商务座");
    }
}

  1. 定义代理主题角色,提供抢票服务的人,持有买票人的信息。
public class ProxyBuyer implements ITicketBuyer {
    // 被代理对象,即真正要买票的人
    private ITicketBuyer realBuyer;

    public ProxyBuyer(ITicketBuyer realBuyer) {
        this.realBuyer = realBuyer;
    }

    @Override
    public void buyTicket() {
        System.out.println("代理人来买票:");
        realBuyer.buyTicket();
    }
}

动态代理,动态地创建代理类,代理对象所有的方法被转发给一个称为 InvocationHandler 的对象,此时调用被代理对象的方法即可实现代理。更多动态代理的知识,请参考「代理模式及Java实现动态代理」。

public class DynamicProxyBuyer implements InvocationHandler {
    // 被代理对象,即真正要买票的人
    private ITicketBuyer ticketBuyer;

    public DynamicProxyBuyer(ITicketBuyer ticketBuyer) {
        this.ticketBuyer = ticketBuyer;
    }

    public ITicketBuyer createProxy() {
        return (ITicketBuyer) Proxy.newProxyInstance(ITicketBuyer.class.getClassLoader(), new Class[]{ITicketBuyer.class}, this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        if ("buyTicket".equals(method.getName())) {
            System.out.println("代理人来买票:");
        }
        return method.invoke(ticketBuyer, args);
    }
}

客户类使用时,直接调用代理对象的方法,即可实现代理的目的。

public class ProxyTest {

    public static void main(String[] args) {
        // 静态代理
        ITicketBuyer realBuyer = new RealBuyer();
        //ITicketBuyer proxyBuyer = new ProxyBuyer(realBuyer);
        //proxyBuyer.buyTicket();

        // 动态代理
        DynamicProxyBuyer dynamicProxyBuyer = new DynamicProxyBuyer(realBuyer);
        ITicketBuyer proxyBuyer = dynamicProxyBuyer.createProxy();
        proxyBuyer.buyTicket();
    }
}

5. 优缺点

1. 优点:
协调调用者和被调用者,降低了系统的耦合;代理对象作为客户端和目标对象之间的中介,起到了保护目标对象的作用

2. 缺点:
由于在客户端和真实主题之间增加了代理对象,因此会造成请求的处理速度变慢;
实现代理模式需要额外的工作(有些代理模式的实现非常复杂),从而增加了系统实现的复杂度。

3. 使用场景:
当需要控制对原始对象的访问时;当需要创建开销非常大的对象时;当需要在访问对象时附加额外操作时。
【附录】

资料图

需要资料的朋友可以加入Android架构交流QQ群聊:513088520

点击链接加入群聊【Android移动架构总群】:加入群聊

获取免费学习视频,学习大纲另外还有像高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)等Android高阶开发资料免费分享。

相关文章

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

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

  • 动态代理原理解析

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

  • Android 代理模式

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

  • 【设计模式Android】代理模式

    设计模式Android 其他相关文章:【设计模式Android】设计模式六大原则 定义:为其他对象提供一种代理以控...

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

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

  • 代理模式

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

  • 2021-03-19

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

  • Android中的设计模式之代理模式

    参考 《设计模式:可复用面向对象软件的基础 》4.7 Proxy 代理--对象结构型模式 《Android源码设计...

  • Android 设计模式之简单工厂模式

    设计模式系列文章 Android 设计模式之单例模式 Android 设计模式之Builder模式 Android...

  • Android设计模式——代理模式

    1.代理模式介绍 代理模式(Proxy Pattern),是七大结构型设计模式之一。 2.代理模式的定义 ...

网友评论

    本文标题:Android 设计模式 - 代理模式

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