前端必须掌握的设计模式——代理模式

简介: 代理模式(Proxy Pattern)是一种结构型设计模式,通过引入“替身”对象来间接访问真实对象,从而解耦并提升性能和安全性。例如,知名艺人复出后,经纪人作为代理筛选商单,确保只处理符合团队利益的请求。代码实现中,定义接口`IService`,艺人和经纪人都实现该接口,经纪人在访问时进行过滤和转发。代理模式常用于权限控制、性能优化等场景,如前端中的Tree-shaking和ES6的Proxy构造方法。

 定义

       代理模式(Proxy Pattern)属于结构型设计模式。让真实的对象有个“替身”,当客户端访问系统时,其实是在访问这个“替身”,这个“替身”用来缓解真实对象的压力,解耦的同时也对性能有所提升。

       当外界不满足访问对象的要求时,需要代理模式对访问进行控制,提升系统的安全级别。所以代理对象可以帮真实对象进行过滤和筛选,当访问请求是符合条件的就放行,不符合条件的就过滤掉。

举例说明

       某知名艺人淡出大众视野好多年,最近王者复出疯狂接活儿,甚至可以在一个工作中找到下一份工作。这名艺人自身实力过硬,深得广大甲方的喜爱,事业蒸蒸日上。那么试想,如果所有的商单都找到这名艺人,这名艺人的日常会苦不堪言,在保持业务水准的同时还要时刻操心各种商务价值。

Pasted Graphic 20.png

       这些商单可能只有极少部分是符合艺人团队的利益,那么艺人如果对所有大大小小的商单都要一一查看比对,那其实绝大多数是在浪费时间。所以,经纪人的角色就自然而然,就像是这名艺人的“代理”,帮助艺人过滤一些没有价值的商单,做出最符合团队利益的选项。这就是代理模式!

Pasted Graphic 21.png

与适配器模式的异同

相同点

  • 都使用了“中介”的角色,用来解耦客户端和系统内部的逻辑。
  • 都属于结构型设计模式,提高了代码的可维护性。

不同点

       主要是使用场景上的差异,适配器模式更适用于多种外界信息标准的统一处理,而代理模式更多是对客户端访问系统内部的取舍。

       一句话的例子,秦统一六国“车同轨、书同文”属于适配器模式,秦始皇吃饭前有太监试吃属于代理模式。

代码实现

       根据代理模式的定义和思想,我们需要定义一个接口IService,让“代理”和“本体”都需要基于这个接口的规范和约束。艺人Allen类,实现IService接口,经纪人Dragon类也实现IService接口,内部处理客户端访问的逻辑。

e oporatlon(): vold.png

       客户端new一个艺人的实例对象,再new一个经纪人的实例对象,将艺人的实例对象传入,用来保证当访问通过时与艺人实例进行通信。然后调用让经纪人类去谈商单,当经纪人对象中的operation方法判断通过后,使用刚传入艺人的实例对象调用operation方法,从而交给艺人去处理商单。

// 代理服务接口
interface IService{
  operation(): void; // 服务对象的操作
}
// 真实的服务对象 艺人(Allen苏)
class Allen implements IService{
  operation(): void {
    console.log('Allen找到了新的工作');
  }
}
// 代理对象 经纪人(龙哥) 1、要实现与真实服务相同的接口 2、需要对访问进行过滤,筛选出符合要求的请求 3、对符合要求的访问进行转发
class Dragon implements IService {
  private rService: Allen;
  constructor(r: Allen) {
    this.rService = r;
  }
  operation() :void {
    // 对外界访问过滤
    if (this.checkAccess()) {
      // 通过访问控制后 转发给真实服务对象
      this.rService.operation();
    } 
  }
  // 过滤访问
  checkAccess(): boolean {
        console.log('龙哥同意了这笔商单');
    return true;
  }
}
// 客户端
const allen = new Allen();
const proxy = new Dragon(allen);
// 与代理类经纪人龙哥打交道 谈商单
proxy.operation();

输出结果如下,在访问代理时,核心是checkAccess方法,用来接受或过滤访问,当访问通过时,再交给系统内部去处理。

龙哥同意了这笔商单.png

前端中的代理模式

       比如在性能优化中tree-shaking,去拿掉那些未使用的代码,从而减少打包体积;比如权限控制,当接口status返回“无权限”时,跳到登陆页,正常返回则正常处理。再比如ES6中的proxy构造方法,通过代理拦截,加入一些自定义代码。

总结

       代理模式算是一个很常见的设计思想,日常工作中也是如此,我们也在时刻扮演“代理者”,领导给我们指派了一些任务,我们去处理一些自己能够解决的问题,如果需要资源再找领导协商,也像是在帮领导“把关”。前端必须掌握的设计模式系列持续更新,如果对您有帮助希望多多点赞哦!

temp1.png

相关文章
|
2天前
|
调度 云计算 芯片
云超算技术跃进,阿里云牵头制定我国首个云超算国家标准
近日,由阿里云联合中国电子技术标准化研究院主导制定的首个云超算国家标准已完成报批,不久后将正式批准发布。标准规定了云超算服务涉及的云计算基础资源、资源管理、运行和调度等方面的技术要求,为云超算服务产品的设计、实现、应用和选型提供指导,为云超算在HPC应用和用户的大范围采用奠定了基础。
|
9天前
|
存储 运维 安全
云上金融量化策略回测方案与最佳实践
2024年11月29日,阿里云在上海举办金融量化策略回测Workshop,汇聚多位行业专家,围绕量化投资的最佳实践、数据隐私安全、量化策略回测方案等议题进行深入探讨。活动特别设计了动手实践环节,帮助参会者亲身体验阿里云产品功能,涵盖EHPC量化回测和Argo Workflows量化回测两大主题,旨在提升量化投研效率与安全性。
云上金融量化策略回测方案与最佳实践
|
11天前
|
人工智能 自然语言处理 前端开发
从0开始打造一款APP:前端+搭建本机服务,定制暖冬卫衣先到先得
通义灵码携手科技博主@玺哥超carry 打造全网第一个完整的、面向普通人的自然语言编程教程。完全使用 AI,再配合简单易懂的方法,只要你会打字,就能真正做出一个完整的应用。
8849 20
|
15天前
|
Cloud Native Apache 流计算
资料合集|Flink Forward Asia 2024 上海站
Apache Flink 年度技术盛会聚焦“回顾过去,展望未来”,涵盖流式湖仓、流批一体、Data+AI 等八大核心议题,近百家厂商参与,深入探讨前沿技术发展。小松鼠为大家整理了 FFA 2024 演讲 PPT ,可在线阅读和下载。
4767 12
资料合集|Flink Forward Asia 2024 上海站
|
15天前
|
自然语言处理 数据可视化 API
Qwen系列模型+GraphRAG/LightRAG/Kotaemon从0开始构建中医方剂大模型知识图谱问答
本文详细记录了作者在短时间内尝试构建中医药知识图谱的过程,涵盖了GraphRAG、LightRAG和Kotaemon三种图RAG架构的对比与应用。通过实际操作,作者不仅展示了如何利用这些工具构建知识图谱,还指出了每种工具的优势和局限性。尽管初步构建的知识图谱在数据处理、实体识别和关系抽取等方面存在不足,但为后续的优化和改进提供了宝贵的经验和方向。此外,文章强调了知识图谱构建不仅仅是技术问题,还需要深入整合领域知识和满足用户需求,体现了跨学科合作的重要性。
|
23天前
|
人工智能 自动驾驶 大数据
预告 | 阿里云邀您参加2024中国生成式AI大会上海站,马上报名
大会以“智能跃进 创造无限”为主题,设置主会场峰会、分会场研讨会及展览区,聚焦大模型、AI Infra等热点议题。阿里云智算集群产品解决方案负责人丛培岩将出席并发表《高性能智算集群设计思考与实践》主题演讲。观众报名现已开放。
|
11天前
|
人工智能 容器
三句话开发一个刮刮乐小游戏!暖ta一整个冬天!
本文介绍了如何利用千问开发一款情侣刮刮乐小游戏,通过三步简单指令实现从单个功能到整体框架,再到多端优化的过程,旨在为生活增添乐趣,促进情感交流。在线体验地址已提供,鼓励读者动手尝试,探索编程与AI结合的无限可能。
三句话开发一个刮刮乐小游戏!暖ta一整个冬天!
|
10天前
|
消息中间件 人工智能 运维
12月更文特别场——寻找用云高手,分享云&AI实践
我们寻找你,用云高手,欢迎分享你的真知灼见!
872 57

热门文章

最新文章