万洋-什么是代理模式

简介: 简介: 影视导演找演员谈合作一般是不会直接找到演员本人,而是先找到演员的经纪人,先由经纪人洽谈,经纪人觉得合适的话就会与演员本人商讨合作事项,这个过程导演与演员是不直接接触的。 这里就用到了**代理模式**,导演其实想找的人是演员,但是要先找到是经纪人,再由经纪人找演员沟通。真正的价值在于演员,但是这个过程中,对于导演来说,经纪人与演员体现出了同样的价值,经纪人会全权代理演员与导演洽谈,经纪人会用自己的专业性过滤掉一些不好的合作意向,从而避免演员被频繁打扰。

什么是代理模式

先来个生活中的小例子

影视导演找演员谈合作一般是不会直接找到演员本人,而是先找到演员的经纪人,先由经纪人洽谈,经纪人觉得合适的话就会与演员本人商讨合作事项,这个过程导演与演员是不直接接触的。

这里就用到了代理模式,导演其实想找的人是演员,但是要先找到是经纪人,再由经纪人找演员沟通。真正的价值在于演员,但是这个过程中,对于导演来说,经纪人与演员体现出了同样的价值,经纪人会全权代理演员与导演洽谈,经纪人会用自己的专业性过滤掉一些不好的合作意向,从而避免演员被频繁打扰。

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

image.png

问题

为什么要控制对于某个对象的访问呢? 举个例子: 有这样一个消耗大量系统资源的巨型对象, 你只是偶尔需要使用它, 并非总是需要。

image.png

数据库查询有可能会非常缓慢

你可以实现延迟初始化: 在实际有需要时再创建该对象。 对象的所有客户端都要执行延迟初始代码。 不幸的是, 这很可能会带来很多重复代码。

在理想情况下, 我们希望将代码直接放入对象的类中, 但这并非总是能实现: 比如类可能是第三方封闭库的一部分。

解决方案

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

image.png

代理将自己伪装成数据库对象, 可在客户端或实际数据库对象不知情的情况下处理延迟初始化和缓存查询结果的工作。

这有什么好处呢? 如果需要在类的主要业务逻辑前后执行一些工作, 你无需修改类就能完成这项工作。 由于代理实现的接口与原类相同, 因此你可将其传递给任何一个使用实际服务对象的客户端。代理模式结构

image.png

  1. 服务接口Service Interface) 声明了服务接口。 代理必须遵循该接口才能伪装成服务对象。
  2. 服务Service) 类提供了一些实用的业务逻辑。
  3. 代理Proxy) 类包含一个指向服务对象的引用成员变量。 代理完成其任务 (例如延迟初始化、      记录日志、 访问控制和缓存等) 后会将请求传递给服务对象。 通常情况下, 代理会对其服务对象的整个生命周期进行管理。
  4. 客户端Client) 能通过同一接口与服务或代理进行交互, 所以你可在一切需要服务对象的代码中使用代理。

代理模式适合应用场景

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

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

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

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

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

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

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

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

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

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

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

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

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

实现方式

  1. 如果没有现成的服务接口, 你就需要创建一个接口来实现代理和服务对象的可交换性。      从服务类中抽取接口并非总是可行的, 因为你需要对服务的所有客户端进行修改, 让它们使用接口。 备选计划是将代理作为服务类的子类, 这样代理就能继承服务的所有接口了。
  2. 创建代理类,      其中必须包含一个存储指向服务的引用的成员变量。 通常情况下, 代理负责创建服务并对其整个生命周期进行管理。 在一些特殊情况下, 客户端会通过构造函数将服务传递给代理。
  3. 根据需求实现代理方法。      在大部分情况下, 代理在完成一些任务后应将工作委派给服务对象。
  4. 可以考虑新建一个构建方法来判断客户端可获取的是代理还是实际服务。      你可以在代理类中创建一个简单的静态方法, 也可以创建一个完整的工厂方法。
  5. 可以考虑为服务对象实现延迟初始化。

代理模式优缺点

优点

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

缺点

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

 

相关文章
|
分布式计算 Ubuntu 调度
如何本地搭建DolphinScheduler并无公网ip远程访问管理界面
如何本地搭建DolphinScheduler并无公网ip远程访问管理界面
595 0
|
存储 数据安全/隐私保护 Windows
Windows 命令提示符(CMD)操作(五):磁盘和磁盘操作
Windows 命令提示符(CMD)操作(五):磁盘和磁盘操作
|
3月前
|
SQL 运维 监控
MySQL高可用生产落地全解:主从同步、MGR集群、读写分离从原理到实战
本文系统讲解MySQL高可用三大核心:主从复制(含GTID、增强半同步实战)、MGR原生集群(单主模式部署、自动选主、脑裂防护)及读写分离(应用层/ProxySQL方案)。涵盖RTO/RPO指标、故障根因分析、全场景最佳实践与容灾预案,助你构建稳定、高性能、可扩展的生产级高可用体系。
397 3
|
4月前
|
人工智能 小程序 数据安全/隐私保护
2026年零基础部署OpenClaw(Clawdbot)集成微信小程序保姆级教程
2026年,AI自动化工具已深度渗透到私域运营、个人办公、中小企业服务等各类场景,OpenClaw(前身为Clawdbot、Moltbot,三者为同一套AI网关系统的不同命名迭代,旧名相关操作命令完全兼容)凭借轻量化容器化架构、灵活的插件扩展能力、自然语言驱动的任务执行效率,以及对多平台的无缝适配特性,成为新手与中小企业打造专属AI助手的首选工具。微信小程序作为国民级轻应用载体,无需下载安装、触达便捷、覆盖全年龄段用户,且依托微信生态实现流量闭环,将OpenClaw与微信小程序深度对接,可快速解锁“小程序发指令、AI自动化执行、实时反馈结果”的核心体验,适配私域客户服务、智能咨询、办公提效、内
2180 2
|
11月前
|
人工智能 边缘计算 自然语言处理
|
6月前
|
人工智能 自然语言处理 语音技术
企业级AI数字员工技术选型指南:玄晶引擎全链路架构 vs 垂类AI工具的核心差异
企业数字化转型中,AI数字员工正从单一工具迈向全链路协同。玄晶引擎以多模态大模型、RPA流程引擎与数据中台为核心,构建覆盖招聘、销售、私域等全环节的智能体系,打破垂类AI工具的数据孤岛,实现技术融合、数据闭环与系统主动兼容,助力企业降本增效。开发者应聚焦架构开放性、数据完整性与落地轻量化,选型具备全链路协同能力的企业级AI解决方案。
356 0
|
机器学习/深度学习 PyTorch API
MindIE Torch快速上手
MindIE Torch 是一款高效的深度学习推理优化工具,支持 PyTorch 模型在 NPU 上的高性能部署。其核心特性包括:1) 子图与单算子混合执行,配合 torch_npu 实现高效推理;2) 支持 C++ 和 Python 编程语言,灵活适配不同开发需求;3) 兼容多种模式(TorchScript、ExportedProgram、torch.compile),覆盖广泛场景;4) 支持静态与动态 Shape 模型编译,满足多样化输入需求。通过简单易用的 API,开发者可快速完成模型加载、编译优化、推理执行及离线模型导出等全流程操作,显著提升开发效率与性能表现。
|
12月前
|
资源调度 安全 Java
服务中国13亿社保持卡人:金保信与阿里云的“一云多芯”升级之路
在全球科技竞争与自主创新的双重驱动下,中国信息技术产业正加速推进科技创新与产业融合等多维布局,积极应对科技领域“卡脖子”难题,构建技术升级与安全保障体系。 而云平台作为产业发展的核心IT基础设施,也已成为数字化转型和升级的关键支撑。2019年,阿里云基于“开放兼容”的理念率先提出并践行“一云多芯”战略,并通过飞天企业版实现从CPU扩展到GPU、网络设备,以及各类行业生态应用、自建应用的全域兼容能力。
1009 1
|
Python
Python猪猪侠代码
Python猪猪侠代码
959 3