问题标签 [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.
language-agnostic - 依赖注入、延迟加载、代理和循环依赖
这是一个独立于语言的问题,但我用 PHP 编写示例代码。
我们有两个类:
- 用户类
- 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,那将是一个循环依赖。
任何代码/评论将不胜感激。
谢谢,
laravel - Laravel 中的 Facade 是实现 Facade 还是代理模式?
据我了解,Facade Pattern的意图是
为子系统中的一组接口提供统一的接口。Facade 定义了一个更高级别的接口,使子系统更易于使用。这可用于将许多复杂的对象交互简化为单个界面。
据我了解,该模式的目标是隐藏子系统中的复杂性(例如,您的外观类调用子系统中的许多对象)。
但是在 Laravel 的 Facade 中,它只有一个类调用另一个类(不是子系统)。对我来说,它看起来更像是一个Proxy
超过Facade
。有人能帮我澄清一下吗?
c# - 代理模式是如何定义的?
据我了解,当我持有对另一种类型的引用作为代理类中的成员时,我实现了代理模式。我还需要提供一个与主题类型相同的接口,并控制对真实对象的访问。
所以,如果我的代码看起来像这样,当 List 成员是主题类型时,我会正确实现代理模式吗?
另外,如果我的描述是正确的,那会使任何具有任何类型成员的类成为代理模式类吗?
java - 代理设计模式:缺点
我正在浏览一篇关于代理模式的文章。
在这篇文章中提到了代理模式的一些缺点,但我无法理解:
1)
这里的缺点是扩展器没有意识到的“魔术”可能正在发生(“黑盒”问题)。请解释一下魔法。
2)
代理可以从其客户端掩盖易失性资源的生命周期和状态。客户端可能在没有意识到资源当前不可用的情况下调用代理......在这种情况下,代理必须阻塞直到资源再次可用,或者它必须产生某种错误。在 Java 术语中,它必须是一个未经检查的异常,因为代理必须符合原始对象的接口。此外,客户端可能不知道它现在调用的资源与它一秒钟前调用的资源不同;如果资源上有任何状态,则客户端可能会混淆该状态似乎已被遗忘。
请解释。
3)
如果使用代理来表示本地进程中的远程资源,这可能会掩盖涉及远程通信的事实。正如我们所知,远程调用与本地调用完全不同,我们的程序不应该将其视为相同。如果代理以某种方式声明它是远程资源的代理,而不是本地资源,那就更好了。然后客户端将能够只选择本地资源,或者在使用远程资源时修改它们的行为。
请您帮助我理解上述与 Proxy 缺点相关的三点吗?
oop - 代理模式和装饰器模式的区别
您能否给出任何好的解释Proxy和Decorator之间的区别是什么?
我看到的主要区别是,当我们假设代理使用组合而装饰器使用聚合时,似乎很明显,通过使用多个(一个或多个)装饰器,您可以修改/添加功能到预先存在的实例(装饰),而代理有自己的代理类的内部实例,并委托给它添加一些附加功能(代理行为)。
问题是 -使用聚合创建的Proxy仍然是Proxy还是Decorator?是否允许(根据 GoF 模式中的定义)创建具有聚合的代理?
python - Python 代理模式类方法失败
我正在研究 Python 中的代理模式。我使用该方法正确代理了常规方法__getattr__
。但是,类方法失败。
我知道这失败了,因为“用户”类定义没有关于 DBClass 的信息,而“用户”的实例有关于 DBClass 的信息。如何解决我在这里想要实现的目标?
附加说明:为简单起见,我删除了继承的某些其他方面。在实际实现中:
我有多个继承自 DBClass 的类
我有多个继承自 DBWrapper 的类
DBClass-Child 的一个实例是传递给 DBWrapper-Child 的构造函数的——类似于 User 类的实例化。
我无法控制 DBClass。它是图书馆的一部分,我无法更改它。
design-patterns - 为什么代理在代理模式中实现主题接口
我正在浏览代理模式,并注意到代理类也实现了主题接口,该接口也由具体实现或主题类实现。
谁能提供我们需要这样做的理由?
我们可以在代理类中创建一个函数并在该函数中调用主题方法。然后客户端代码可以调用这个代理类函数并且可以调用适当的方法。
design-patterns - 代理模式 - 真实的主题不会对客户隐藏
当然,我正在阅读有关DoFactory和Wikipedia以及 Stack Overflow 上的代理。一切都很清楚,除了Real Subject
。在 DoFactory 上,Proxy 定义为:
为另一个对象提供代理或占位符以控制对其的访问。(添加了粗体字)
如果它的目的是控制访问Real Subject
,为什么Real Subject
不隐瞒Client
呢?
这是代理的UML图:
在代码示例中,Real Subject
定义为:
客户端通过它创建一个实例Proxy
并“控制访问” Real Subject
:
但是(从我看到的几个例子中)没有什么可以阻止 Client 实例化Real Subject
和访问它的方法。我想知道这是为什么?
java - 代理和动态代理模式之间的区别
我试图了解代理和动态代理模式之间的区别。从我到目前为止所读到的,我发现的唯一一件事是代理类字节码是在编译时创建的,而在动态代理上它是在运行时创建的。我还缺少其他差异吗?如果不是,那么选择代理而不是动态代理的原因是什么(性能问题除外)
java - 具有多个接口的代理模式
我instanceof
用来测试能力。
如果我有一个cage
有动物的笼子,并且想为动物添加飞行和奔跑的代理
我执行以下操作
第 11 行失败。在第 09 行我需要添加Fly.class
但没有动态方法吗?