问题标签 [proxy-pattern]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
550 浏览

language-agnostic - 依赖注入、延迟加载、代理和循环依赖

这是一个独立于语言的问题,但我用 PHP 编写示例代码。

我们有两个类:

  1. 用户
  2. UserRepository

UserRepository 类处理与 DB 的交互并将所需的 User 加载到 User 对象中并返回它。

在 User 类中,假设有一个 email 属性一开始就没有加载,它会在需要时从数据库中延迟加载。但是User类不应该知道UserRepository类,所以我们在这里创建一个电子邮件代理。它知道UserRepository并且无论需要电子邮件,它都会从UserRepository询问它。

所以这是到目前为止的代码:

用户类

UserRepository 类

电子邮件代理类

这是使用示例:

到目前为止,一切都很好。但这是我需要你帮助的棘手部分。从本质上讲,UserRepository 应该负责从 DataBase 中获取 User 对象,构造 User 对象并返回它。如下所示:

所以我的问题是如何将 EmailProxy 传递给由UserRepository创建的User对象?

  • 您是否将 UserProxy 实例注入到 UserRepository 以便可以将其注入到新创建的 User 对象中?

  • 你会为此使用依赖注入容器吗?

  • 你会用工厂吗?

编辑

EmailProxy已经知道UserRepository,如果我们也将EmailProxy传递给UserRepository,那将是一个循环依赖。

任何代码/评论将不胜感激。

谢谢,

0 投票
1 回答
860 浏览

laravel - Laravel 中的 Facade 是实现 Facade 还是代理模式?

据我了解,Facade Pattern的意图是

为子系统中的一组接口提供统一的接口。Facade 定义了一个更高级别的接口,使子系统更易于使用。这可用于将许多复杂的对象交互简化为单个界面。

在此处输入图像描述

据我了解,该模式的目标是隐藏子系统中的复杂性(例如,您的外观类调用子系统中的许多对象)。

但是在 Laravel 的 Facade 中,它只有一个类调用另一个(不是子系统)。对我来说,它看起来更像是一个Proxy超过Facade。有人能帮我澄清一下吗?

0 投票
1 回答
401 浏览

c# - 代理模式是如何定义的?

据我了解,当我持有对另一种类型的引用作为代理类中的成员时,我实现了代理模式。我还需要提供一个与主题类型相同的接口,并控制对真实对象的访问。

所以,如果我的代码看起来像这样,当 List 成员是主题类型时,我会正确实现代理模式吗?

另外,如果我的描述是正确的,那会使任何具有任何类型成员的类成为代理模式类吗?

0 投票
1 回答
3638 浏览

java - 代理设计模式:缺点

我正在浏览一篇关于代理模式的文章。

解释后阅读评论

在这篇文章中提到了代理模式的一些缺点,但我无法理解:

1)这里的缺点是扩展器没有意识到的“魔术”可能正在发生(“黑盒”问题)。请解释一下魔法

2)代理可以从其客户端掩盖易失性资源的生命周期和状态。客户端可能在没有意识到资源当前不可用的情况下调用代理......在这种情况下,代理必须阻塞直到资源再次可用,或者它必须产生某种错误。在 Java 术语中,它必须是一个未经检查的异常,因为代理必须符合原始对象的接口。此外,客户端可能不知道它现在调用的资源与它一秒钟前调用的资源不同;如果资源上有任何状态,则客户端可能会混淆该状态似乎已被遗忘。

请解释。

3)如果使用代理来表示本地进程中的远程资源,这可能会掩盖涉及远程通信的事实。正如我们所知,远程调用与本地调用完全不同,我们的程序不应该将其视为相同。如果代理以某种方式声明它是远程资源的代理,而不是本地资源,那就更好了。然后客户端将能够只选择本地资源,或者在使用远程资源时修改它们的行为。

请您帮助我理解上述与 Proxy 缺点相关的三点吗?

0 投票
10 回答
48247 浏览

oop - 代理模式和装饰器模式的区别

您能否给出任何好的解释ProxyDecorator之间的区别是什么?

我看到的主要区别是,当我们假设代理使用组合装饰器使用聚合时,似乎很明显,通过使用多个(一个或多个)装饰器,您可以修改/添加功能到预先存在的实例(装饰),而代理有自己的代理类的内部实例,并委托给它添加一些附加功能(代理行为)。

问题是 -使用聚合创建的Proxy仍然是Proxy还是Decorator?是否允许(根据 GoF 模式中的定义)创建具有聚合的代理?

0 投票
0 回答
124 浏览

python - Python 代理模式类方法失败

我正在研究 Python 中的代理模式。我使用该方法正确代理了常规方法__getattr__。但是,类方法失败。

我知道这失败了,因为“用户”类定义没有关于 DBClass 的信息,而“用户”的实例有关于 DBClass 的信息。如何解决我在这里想要实现的目标?

附加说明:为简单起见,我删除了继承的某些其他方面。在实际实现中:

  • 我有多个继承自 DBClass 的类

  • 我有多个继承自 DBWrapper 的类

  • DBClass-Child 的一个实例是传递给 DBWrapper-Child 的构造函数的——类似于 User 类的实例化。

  • 我无法控制 DBClass。它是图书馆的一部分,我无法更改它。

0 投票
2 回答
107 浏览

design-patterns - 为什么代理在代理模式中实现主题接口

我正在浏览代理模式,并注意到代理类也实现了主题接口,该接口也由具体实现或主题类实现。

谁能提供我们需要这样做的理由?

我们可以在代理类中创建一个函数并在该函数中调用主题方法。然后客户端代码可以调用这个代理类函数并且可以调用适当的方法。

0 投票
2 回答
418 浏览

design-patterns - 代理模式 - 真实的主题不会对客户隐藏

当然,我正在阅读有关DoFactoryWikipedia以及 Stack Overflow 上的代理。一切都很清楚,除了Real Subject。在 DoFactory 上,Proxy 定义为:

为另一个对象提供代理或占位符以控制对其的访问。(添加了粗体字)

如果它的目的是控制访问Real Subject,为什么Real Subject不隐瞒Client呢?

这是代理的UML图:

代理 UML

在代码示例中,Real Subject定义为:

客户端通过它创建一个实例Proxy并“控制访问” Real Subject

但是(从我看到的几个例子中)没有什么可以阻止 Client 实例化Real Subject和访问它的方法。我想知道这是为什么?

0 投票
2 回答
4329 浏览

java - 代理和动态代理模式之间的区别

我试图了解代理和动态代理模式之间的区别。从我到目前为止所读到的,我发现的唯一一件事是代理类字节码是在编译时创建的,而在动态代理上它是在运行时创建的。我还缺少其他差异吗?如果不是,那么选择代理而不是动态代理的原因是什么(性能问题除外)

0 投票
1 回答
1402 浏览

java - 具有多个接口的代理模式

instanceof用来测试能力。

如果我有一个cage有动物的笼子,并且想为动物添加飞行和奔跑的代理

我执行以下操作

第 11 行失败。在第 09 行我需要添加Fly.class但没有动态方法吗?