首页 > 其他分享 >Book-深入设计模式-代理模式

Book-深入设计模式-代理模式

时间:2023-03-06 18:37:11浏览次数:44  
标签:服务 对象 代理 模式 Book 接口 设计模式 客户端

Book-深入设计模式-代理模式

https://refactoringguru.cn/design-patterns/proxy

代理模式
亦称: Proxy

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

代理模式建议新建一个与原服务对象接口相同的代理类, 然后更新应用以将代理对象传递给所有原始对象客户端。 代理类接收到客户端请求后会创建实际的服务对象, 并将所有工作委派给它。

代理模式结构

![](.\proxy structure.png)
proxy structure

代理模式适合应用场景

使用代理模式的方式多种多样

  1. 延迟初始化 (虚拟代理)。 如果你有一个偶尔使用的重量级服务对象, 一直保持该对象运行会消耗系统资源时, 可使用代理模式。
    你无需在程序启动时就创建该对象, 可将对象的初始化延迟到真正有需要的时候。

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

  3. 本地执行远程服务 (远程代理)。 适用于服务对象位于远程服务器上的情形。
    在这种情形中, 代理通过网络传递客户端请求, 负责处理所有与网络相关的复杂细节。

  4. 记录日志请求 (日志记录代理)。 适用于当你需要保存对于服务对象的请求历史记录时。
    代理可以在向服务传递请求前进行记录。

  5. 缓存请求结果 (缓存代理)。 适用于需要缓存客户请求结果并对缓存生命周期进行管理时, 特别是当返回结果的体积非常大时。
    代理可对重复请求所需的相同结果进行缓存, 还可使用请求参数作为索引缓存的键值。

  6. 智能引用。 可在没有客户端使用某个重量级对象时立即销毁该对象。
    代理会将所有获取了指向服务对象或其结果的客户端记录在案。 代理会时不时地遍历各个客户端, 检查它们是否仍在运行。 如果相应的客户端列表为空, 代理就会销毁该服务对象, 释放底层系统资源。
    代理还可以记录客户端是否修改了服务对象。 其他客户端还可以复用未修改的对象。

实现方式

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

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

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

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

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

代理模式优缺点

优点

  • 你可以在客户端毫无察觉的情况下控制服务对象。
  • 如果客户端对服务对象的生命周期没有特殊要求, 你可以对生命周期进行管理。
  • 即使服务对象还未准备好或不存在, 代理也可以正常工作。
  • 开闭原则。 你可以在不对服务或客户端做出修改的情况下创建新代理。

缺点

  • 代码可能会变得复杂, 因为需要新建许多类。
  • 服务响应可能会延迟。

与其他模式的关系

  • 适配器模式能为被封装对象提供不同的接口, 代理模式能为对象提供相同的接口, 装饰模式则能为对象提供加强的接口。

  • 外观模式与代理的相似之处在于它们都缓存了一个复杂实体并自行对其进行初始化。 代理与其服务对象遵循同一接口, 使得自己和服务对象可以互换, 在这一点上它与外观不同。

  • 装饰和代理有着相似的结构, 但是其意图却非常不同。 这两个模式的构建都基于组合原则, 也就是说一个对象应该将部分工作委派给另一个对象。 两者之间的不同之处在于代理通常自行管理其服务对象的生命周期, 而装饰的生成则总是由客户端进行控制。

标签:服务,对象,代理,模式,Book,接口,设计模式,客户端
From: https://www.cnblogs.com/yongchao/p/17184908.html

相关文章

  • Docker使用socks5代理
    Docker网络Http代理设置背景在一些实验室环境,服务器没有直接连接外网的权限,需要通过网络代理。我们通常会将网络代理直接配置在/etc/environment、/etc/profile之类的配......
  • 设计模式
    设计原则solid1、开闭原则(OpenClosePrinciple)开闭原则的意思是:对扩展开放,对修改关闭。2、里氏代换原则(LiskovSubstitutionPrinciple)里氏代换原则是面向对象设计的......
  • Book-深入设计模式-享元模式
    Book-深入设计模式-享元模式https://refactoringguru.cn/design-patterns/flyweight享元模式亦称:缓存、Cache、Flyweight享元模式是一种结构型设计模式,它摒弃了在每......
  • 设计模式
    设计模式1.修饰器模式2.模板设计模式......
  • 设计模式
    设计模式设计模式+反射+泛型+注解/配置文件等单例模式最简单,考的最多的一个设计模式要点(1)构造器私有化(2)在本类中创建这个唯一的实例分类//饿汉式/......
  • 前端设计模式——工厂模式
    前端中的工厂模式是一种创建对象的设计模式,它可以让我们封装创建对象的细节,我们使用工厂方法而不是直接调用new关键字来创建对象,使得代码更加清晰、简洁和易于维护。在前......
  • Jupyter notebook的使用
    Jupyternotebook的使用1.简介JupyterNotebook是基于网页的用于交互计算的应用程序。其可被应用于全过程计算:开发、文档编写、运行代码和展示结果。——JupyterNoteb......
  • 计算机基础_设计模式
    熟练使用前端常用的设计模式编写代码如单例模式、装饰器模式、代理模式等 发布订阅模式和观察者模式的异同以及实际应用一、定性区别首先,观察者是经典软件设计模式中......
  • JupterNotebook运行按钮不见了
    原因是被css隐藏了,打开Lib\site-packages\notebook\static\style\style.min.css定位div.run_this_cell把display:none删掉即可参考:https://www.kaggle.com/questions-......
  • 设计模式
    软件设计师:23种设计模式 总图创建型设计模式1.抽象工厂方法模式#代码packagenwnu.sun.patterns.createtype.abstractfactory;/***抽象工厂设计......