Android开发-设计模式-代理模式(Proxy)

本文深入解析了代理模式,一种常用的设计模式,介绍了其角色包括抽象主题、代理主题和真实主题,展示了模式的结构图和实现方式,并探讨了远程代理、虚拟代理、保护代理等多种形式的应用场景。

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

介绍

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

模式角色

代理模式有以下角色:

  • Subject(抽象主题),通过接口或抽象类声明真实角色实现的业务方法。
  • Proxy(代理主题),实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
  • RealSubject(真实主题),实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。

模式结构图

在这里插入图片描述

模式实现

/**
 * 抽象主题角色
 */
public abstract class Subject {

    /**
     * 声明一个抽象的请求方法
     */
    abstract public void request();
}
/**
 * 真实主题角色
 */
public class RealSubject extends Subject {

    public RealSubject() {
    }

    @Override
    public void request() {
        // 业务逻辑
    }
}
/**
 1. 代理主题角色
 */
public class ProxySubject extends Subject {

    private RealSubject realSubject;

    public ProxySubject() {
    }

    public ProxySubject(RealSubject realSubject) {
        this.realSubject = realSubject;
    }

    @Override
    public void request() {
        preRequest();

        if (null == realSubject) {
            realSubject = new RealSubject();
        }
        realSubject.request();

        postRequest();
    }

    private void preRequest() {
        // 请求前的业务逻辑
    }

    private void postRequest() {
        // 请求后的业务逻辑
    }
}

        代理模式可能并不知道真正的被代理对象,而仅仅持有一个被代理对象的接口。这时候代理对象不能够创建被代理对象,被代理对象必须由系统的其他角色代为创建并且传入。这种做法可以提供更大的灵活性(Java 2.0所提供的对代理模式的支持就是采取了这种做法)。

模式的几种形式

  1. 远程代理,也就是为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实。比如说 WebService,当我们在应用程序的项目中加入一个 Web 引用,引用一个 WebService,此时会在项目中声称一个 WebReference 的文件夹和一些文件,这个就是起代理作用的,这样可以让那个客户端程序调用代理解决远程访问的问题。
  2. 虚拟代理,是根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象。这样就可以达到性能的最优化,比如打开一个网页,这个网页里面包含了大量的文字和图片,但我们可以很快看到文字,但是图片却是一张一张地下载后才能看到,那些未打开的图片框,就是通过虚拟代里来替换了真实的图片,此时代理存储了真实图片的路径和尺寸。
  3. 保护代理,用来控制真实对象访问时的权限。一般用于对象应该有不同的访问权限的时候。
  4. 智能引用代理,是指当调用真实的对象时,代理处理另外一些事。比如计算真实对象的引用次数,这样当该对象没有引用时,可以自动释放它,或当第一次引用一个持久对象时,将它装入内存,或是在访问一个实际对象前,检查是否已经释放它,以确保其他对象不能改变它。这些都是通过代理在访问一个对象时附加一些内务处理。
  5. Copy-on-Write代理,用代理模式实现延迟加载的一个经典应用就在 Hibernate 框架里面。当 Hibernate 加载实体 bean 时,并不会一次性将数据库所有的数据都装载。默认情况下,它会采取延迟加载的机制,以提高系统的性能。Hibernate 中的延迟加载主要分为属性的延迟加载和关联表的延时加载两类。实现原理是使用代理拦截原有的 getter 方法,在真正使用对象数据时才去数据库或者其他第三方组件加载实际的数据,从而提升系统性能。
  6. Cache代理,为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。
  7. 防火墙代理,保护目标,不让恶意用户接近。
  8. 同步化代理,使几个用户能够同时使用一个对象而没有冲突。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值