打字稿:retentativa de upload com o design pattern Proxy
打字稿:retentativa de upload com o design pattern Proxy
imagem retirada do site https://refactoring.guru
O型 代理人 是著名的四人帮 (GoF) 定义的结构模式之一。根据 GoF 定义,代理模式将:
提供一个代理或点,一个对象可以通过它控制对另一个对象的访问。
通过实现它,您基本上添加了一些可以在调用原始类之前或之后执行的逻辑。在这一点上,Proxy 实现的可能性几乎是无穷无尽的,仅受程序员想象力的限制。
但是使用代理模式有什么好处呢?您可以在不修改原始类的情况下添加功能。假设您需要向 lib 或外部服务添加新功能,在这两种情况下您都无权访问实现。在这种情况下,基于代理模式的实现可以很好地发挥作用!
当无法进行更改或这样做的成本非常昂贵时,使用模式代理。
示例:上传失败时重试。
曾几何时,公司聘请了一位新程序员泰勒。他的首要任务之一是 添加重试流以在主系统上上传文件 .他知道系统中已经存在一个上传服务,并且反过来,它在应用程序的多个地方被调用。
在分析情况时,Taylor 注意到了一个重点:上传服务是一个 外部微服务 这是从系统内部调用的,因此他无权访问源代码进行更改。
哦洞察力…
通过对问题的完整分析,他记得一个有趣的解决方案是基于代理模式实现一些东西,因为:“ 当无法更改或更改成本太高时使用模式代理 ”。因此,他开发了下图来帮助记录他的解决方案:
Diagrama UML de uma solução encontrada por Taylor
以前的解决方案,没有重试功能,仅由类组成 S3上传器
,它实现了接口 上传者
.使用代理模式的概念,又添加了一个组件: ProxyS3Uploader
.
请注意,代理类使用与真实类相同的接口。因此,完全可以用代理代替真实的类。另一个重要的细节是代理类在没有其构造函数的情况下接收类型的依赖项 上传者
,在这种情况下,泰勒将注入真正的类依赖项。
您是否意识到通过这种方式解决方案是解耦且易于实施的?
动手!
现在是每个人都喜欢的时候了:写代码!该解决方案将如何实施?
注意:以下代码并未实现真正的解决方案,而只是一个教学示例。
- 界面
上传者
implementação da interface Uploader
- 班级
S3上传器
implementação da classe S3Uploader
在这个实现中,我试图模拟一个“真实”的场景,其中 75% 的调用可能会失败。导致需要为此操作实现重试功能。
- 班级
ProxyS3Uploader
implementação da classe proxy
正如我们在上面的代码中看到的,对真实类的调用在声明中 试着抓
其中,如果发生异常,该方法基于最大发生限制执行重试例程。重试发生在,在块的末尾 抓住
,该方法是自执行的。
- 开始
implementação da função inicial
正是在这一步中,我们通过注入真正的类依赖来实例化代理类,最后执行该方法 上传
.
下图是运行所有示例代码时可能获得的输出之一:
execução do código de exemplo
结论
GoF 记录了几种设计模式,即:创建模式、结构模式和行为模式。模式的目的是以一种可以在不同上下文中以简单且可重用的方式重新应用的方式对现有知识进行编码。根据 GoF:
“了解这些模式对于理解现代框架和开发追求最佳面向对象结果的高质量软件至关重要。”
代理模式是结构模式的一个例子,它很简单,非常强大,可以适用于许多用例。
您还能想到哪些使用代理模式的用例?把它留在评论中!
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明