问题标签 [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 回答
534 浏览

c++ - 在 C++11 中实现递归代理模式

假设我们有一些Foo对象允许:

这需要代理设计模式(由 Scott Meyers 详细介绍

但现在让我们假设everymyFoo[i]也是一个Foo实例。

我接近实现,但我无法摆脱最后一个讨厌的“前向声明/不完整类型”错误。

首先,让我们先解决一个简单的问题:

这是基本的非递归代理模式:

不确定我是否需要最后一个处理程序。

无论如何,为了使其递归,我们需要:

这意味着我们不能再定义Proxywithin Object,否则我们会得到一个“attempting to base from incomplete type”编译器错误。

所以让我们这样做。我们还必须尽可能修改构造函数以填充基类:

然后,由于Object基类,我们将不再需要手动处理 typecast-to-object:

但这就是它变得粗糙的地方。

如果我们将Object::Proxy' 的定义移到 (after, in fact) 之外Object,原来的

... 现在给我们一个错误,因为我们使用了不完整的类 ( Proxy)。请注意,简单地将定义移到外部并不能解决返回类型为Proxy. 要是Proxy*我们能做到就好了。但Proxy不能。

它似乎是 Catch-22,我看不到任何干净的解决方案。

有吗?

编辑:针对建议有缺陷的设计的评论,请记住这Object是指针周围的轻量级包装器。它只有一个PyObject*数据成员。

编辑:我正在使用的原始代码可以在这里找到

0 投票
3 回答
1149 浏览

c++ - 重载 -> 操作员通过代理转发成员访问

我正在尝试将 Python 包装PyObject*在一个Object类中。在 Python 中,一切都是PyObject*. 列表是 a PyObject*,列表中的每个项目本身都是 a PyObject*。这甚至可能是另一个列表。等等

我正在尝试fooList[42] = barObj通过代理模式(此处)来允许样式语法。

现在我已经开始工作了,我想扩展它,以便fooList[42]可以用作Object. 具体来说,我希望能够处理......

Object有很多方法,目前fooList[42].myObjMethod()打算先解析fooList[42]成一个Proxy实例,say tmpProxy,然后再尝试tmpProxy.myObjMethod()

这意味着我必须做

即通过 手动中继每个Object方法Proxy,这很丑陋。

我看不到任何完美的解决方案(请参阅上面的链接答案),但我很乐意使用:

...作为一种折衷方案,看到 as ->可以重载(而不是不能重载.)。

但是,我找不到任何有关重载的文档operator->

我最好的猜测是它必须返回一个指向某个对象(比如pObj)的指针,而 C++ 将调用pObj->whatever.


下面是我尝试的实现。但是,我遇到了“获取 Object 类型的临时对象的地址”警告。

在我的Object班级里,我有:

请注意,“const Object&”会遇到“获取 Object 类型的临时对象的地址”警告。

这个想法是允许myList[5]->someMemberObj = ...样式语法。

myList[5]解析为一个Proxy实例,它包装了一个Object(的第六个元素myList)。让我们称之为myItem

现在我想someProxy->fooFunc()或分别someProxy->fooProperty调用myItem.fooFunc()myItem.fooProperty

我遇到了“获取对象类型的临时对象的地址”警告。

0 投票
1 回答
133 浏览

design-patterns - 代理模式 - 为什么要从真实对象类实现接口?

我不明白为什么我必须在代理模式目标对象中实现接口来表示。我认为它是接口的常见用途,它由代理类实现,它将提供获取真实的对象类信息并将它们显示给客户端......但我看到所有真实的对象类示例都实现了接口。 ....为什么?

0 投票
3 回答
8229 浏览

java - Java 回退模式

我正在尝试找到一种实现依赖于第三方库类的服务的好方法。如果库不可用或无法提供答案,我还有一个“默认”实现用作后备。

服务的实际实现类似于:

当前的实现似乎有点重复,只有对服务的实际调用不同,但 try/catch 和默认机制几乎相同。此外,如果在服务中添加了另一种方法,则实现看起来几乎相同。

是否有可能适用于此处的设计模式(代理策略)以使代码看起来更好并减少进一步的添加复制粘贴?

0 投票
1 回答
76 浏览

c# - 如何在 asp.net 3.5 中创建装饰器代理页面

我正在尝试制作此功能,但我真的被卡住了。

我有两个在同一个域上运行的应用程序。我需要让一个应用程序在它自己的(第一个)母版页中从另一个应用程序加载页面。

当然,我完全控制了双方的代码。

我尝试过使用 HTTPRequest 和 HTTPResponse,并且尝试过使用 WebBrowser。只要我有静态(纯 HTML)页面,两者都可以很好地工作。但是,这些页面实际上是动态的。用户需要按下服务器端按钮(回发)并通常使用会话、视图状态和/或 cookie。

因此,HTTPRequest 和 WebBrowser 让我失望了,因为它们不会导致回发,因此这些服务器端控件不起作用。更重要的是,如果我尝试通过在每次响应后保存 ViewState 来“伪造”回发,而不是在下一次请求时重新发送,那么在几(3-4)次之后,原始页面将返回“状态信息对此页面可能已损坏”错误,即使我使用

EnableViewStateMac ="false" EnableSessionState="True" EnableEventValidation ="false" ValidateRequest ="false" ViewStateEncryptionMode ="从不

所以......任何想法我该如何解决这个问题?

提前致谢

0 投票
1 回答
117 浏览

design-patterns - 有代理模式和没有代理模式

我已经浏览了几个示例,但我没有找到任何显示相同示例的示例使用代理模式和不使用代理模式,

有人有一个通用的例子吗?通过看到这样的例子肯定会明白我们是否真的需要使用代理模式

0 投票
2 回答
195 浏览

c++ - 如何在插件系统中正确公开 API?

在下面的类图中,您可以看到我当前的插件/扩展系统方法。我想为通用/全局事物提供扩展 API。但是公开的 API 应该只包含被引用对象的实际功能的一个子集。我的第一个想法是使用接口。这样做的问题是,一个邪恶的插件可能会将接口向下转换为内部类并搞砸事情。(我应该关心吗?)第二个想法是使用代理模式。目前我同时使用它们。我想这不是真的必要。但是考虑到二进制兼容性如何降低这里的复杂性?

在此处输入图像描述

0 投票
0 回答
512 浏览

c# - 如何在后台工作人员完成后强制c#图片框更新其图像

我的主要目标是从服务器加载图像,在加载过程运行时,我想显示一个占位符而不是真实图像。

为了实现这个目标,我使用 C# 和 Windows 窗体。我必须使用代理模式和 C# 后台工作者,这意味着加载和视图使用不同的线程。

我知道已经有使用代理模式进行图像加载的示例,但我还没有找到任何使用后台工作程序从服务器加载图像的解决方案。

我已经实现了核心功能,但我现在陷入了一个问题:当图像完全加载并且后台工作人员完成了他的工作时,我如何强制我的图片框加载真实图像。

我的设计如下所示:

目前图片框只显示虚拟图像,因为后台工作人员已经加载了图像,但没有通知图片框使用它而不是虚拟图像。

如果有人能告诉我如何将真实图像设置为图片框的图像,我会很高兴。

0 投票
0 回答
770 浏览

ios - Swift 的代理对象

我正在尝试使用 swift 实现代理模式,以为从 NSObject 继承的自定义对象创建配置对象。它类似于 UIView 的 UIAppearance。但是我不明白如何进行方法调用转发,我会在 Objective-c 中使用forwardInvocation:方法和NSInvocation类来做。

如果有人遇到此类问题并有解决方案,我将不胜感激。提前致谢。

0 投票
1 回答
1498 浏览

java - 何时使用“动态代理类”或“标准代理”模式?

为什么要使用“动态代理类”而不是“标准代理”模式?

两者的缺点或优点是什么?

似乎它们都有相同的最终结果,只是它们的实现方式不同。

动态代理类 https://docs.oracle.com/javase/8/docs/technotes/guides/reflection/proxy.html

动态代理类是一个实现在运行时指定的接口列表的类,这样通过类实例上的一个接口的方法调用将被编码并通过统一接口分派到另一个对象。因此,动态代理类可用于为接口列表创建类型安全的代理对象,而无需预先生成代理类,例如使用编译时工具。动态代理类实例上的方法调用被分派到实例的调用处理程序中的单个方法,并且它们使用标识被调用方法的 java.lang.reflect.Method 对象和包含对象类型的数组进行编码论据。

标准代理模式https://en.wikipedia.org/wiki/Proxy_pattern

代理,在其最一般的形式中,是一个作为与其他事物的接口的类。代理可以连接到任何东西:网络连接、内存中的大对象、文件或其他一些昂贵或无法复制的资源。简而言之,代理是由客户端调用以访问幕后真实服务对象的包装器或代理对象。在代理中可以提供额外的功能,例如当对真实对象的操作是资源密集型时进行缓存,或者在调用对真实对象的操作之前检查先决条件。对于客户端,代理对象的使用与使用真实对象类似,因为两者都实现相同的接口。