美文网首页
设计模式之代理模式

设计模式之代理模式

作者: Ritchie_Li | 来源:发表于2022-10-21 12:54 被阅读0次

代理模式是一种结构型设计模式, 让你能够提供对象的替代品或其占位符。 代理控制着对于原对象的访问, 并允许在将请求提交给对象前后进行一些处理。

 解决方案

代理模式建议新建一个与原服务对象接口相同的代理类, 然后更新应用以将代理对象传递给所有原始对象客户端。 代理类接收到客户端请求后会创建实际的服务对象, 并将所有工作委派给它。这有什么好处呢? 如果需要在类的主要业务逻辑前后执行一些工作, 你无需修改类就能完成这项工作。 由于代理实现的接口与原类相同, 因此你可将其传递给任何一个使用实际服务对象的客户端。

 

代理模式适合应用场景

使用代理模式的方式多种多样, 我们来看看最常见的几种。

 延迟初始化 (虚拟代理)。 如果你有一个偶尔使用的重量级服务对象, 一直保持该对象运行会消耗系统资源时, 可使用代理模式。

 你无需在程序启动时就创建该对象, 可将对象的初始化延迟到真正有需要的时候。

 访问控制 (保护代理)。 如果你只希望特定客户端使用服务对象, 这里的对象可以是操作系统中非常重要的部分, 而客户端则是各种已启动的程序 (包括恶意程序), 此时可使用代理模式。

 代理可仅在客户端凭据满足要求时将请求传递给服务对象。

 本地执行远程服务 (远程代理)。 适用于服务对象位于远程服务器上的情形。

 在这种情形中, 代理通过网络传递客户端请求, 负责处理所有与网络相关的复杂细节。

 记录日志请求 (日志记录代理)。 适用于当你需要保存对于服务对象的请求历史记录时。

 代理可以在向服务传递请求前进行记录。

 缓存请求结果 (缓存代理)。 适用于需要缓存客户请求结果并对缓存生命周期进行管理时, 特别是当返回结果的体积非常大时。

 代理可对重复请求所需的相同结果进行缓存, 还可使用请求参数作为索引缓存的键值。

 智能引用。 可在没有客户端使用某个重量级对象时立即销毁该对象。

 代理会将所有获取了指向服务对象或其结果的客户端记录在案。 代理会时不时地遍历各个客户端, 检查它们是否仍在运行。 如果相应的客户端列表为空, 代理就会销毁该服务对象, 释放底层系统资源。

代理还可以记录客户端是否修改了服务对象。 其他客户端还可以复用未修改的对象。

实现方式

如果没有现成的服务接口, 你就需要创建一个接口来实现代理和服务对象的可交换性。 从服务类中抽取接口并非总是可行的, 因为你需要对服务的所有客户端进行修改, 让它们使用接口。 备选计划是将代理作为服务类的子类, 这样代理就能继承服务的所有接口了。

创建代理类, 其中必须包含一个存储指向服务的引用的成员变量。 通常情况下, 代理负责创建服务并对其整个生命周期进行管理。 在一些特殊情况下, 客户端会通过构造函数将服务传递给代理。

根据需求实现代理方法。 在大部分情况下, 代理在完成一些任务后应将工作委派给服务对象。

可以考虑新建一个构建方法来判断客户端可获取的是代理还是实际服务。 你可以在代理类中创建一个简单的静态方法, 也可以创建一个完整的工厂方法。

可以考虑为服务对象实现延迟初始化。

Java示例代码:

public class ProxyPattern {

    public static void main(String[] args) {

        RealSubject realSubject = new RealSubject();

        Proxy proxy = new Proxy(realSubject);

        proxy.buy();

    }

}

interface Subject {

    public void buy();

}

class Proxy implements Subject {

    protected RealSubject realSubject;

    public Proxy(RealSubject realSubject) {

        this.realSubject = realSubject;

    }

    @Override

    public void buy() {

        System.out.println("办理购买前的手续");

        realSubject.buy(); // 付钱

        System.out.println("办理购买后的手续");

    }

}

class RealSubject implements Subject {

    @Override

    public void buy() {

        System.out.println("付钱");

    }

}

相关文章

  • 设计模式之代理模式

    设计模式之代理模式 10分钟看懂动态代理设计模式(升级篇)-对这篇动态代理模式的思路整理 仿JDK实现动态代理逻辑...

  • 代理模式

    设计模式之代理模式 什么是代理模式? 指的事代理对象为其他对象提供代理以控制对被...

  • Java设计模式之代理模式

    Java设计模式之代理模式 代理模式 静态代理 动态代理 为什么需要代理 通过代理,我们能够不用知道委托人是谁,而...

  • Java代理模式之JDK动态代理

    了解什么是动态代理模式,可参考Java设计模式之代理模式 简介 JDK动态代理是java.lang.reflect...

  • 设计模式之代理模式2

    设计模式之代理模式运用 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对...

  • 设计模式之代理模式

    设计模式之代理模式 简介 代理模式是结构型设计模式。 当无法或不想直接访问某个对象或访问某个对象存在困难时可以通过...

  • 设计模式之代理模式

    title: 设计模式之代理模式date: 2018-08-15 20:25:42tags: 设计模式 笔记 Ja...

  • java设计模式之代理模式(静态代理)

      今天给大家分享的是java设计模式之代理模式中的静态代理模式,动态代理模式将在后面文章中给出。如有不足,敬请指...

  • Android 代理模式

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

  • 设计模式之代理模式

    设计模式之代理模式 1.代理模式的定义 为其他对象提供一种代理以控制对这个对象的访问. 2.代理模式的使用场景 当...

网友评论

      本文标题:设计模式之代理模式

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