问题标签 [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.
java - 如何在 Java 中跟踪方法结果
简而言之,我正在开发一个系统,该系统能够为您提供有关执行 java 程序所提供的结果的信息。考虑过下面的问题,不知道能不能用java解决。
我有以下课程:
到目前为止,我可以通过使用动态代理来捕获方法的每次调用。特别是,我使用包 java.lang.reflect 中的代理和 InvocationHandler 对象。这是我遵循的示例(https://www.concretepage.com/java/dynamic-proxy-with-proxy-and-invocationhandler-in-java)。
我的问题是,如果有人知道我如何提供诸如:“method1() 的返回是从 method2() 的返回生成的,而 method2() 的返回又是从 method3() 的返回生成的, method4() 的返回”。
c++ - 使用按返回类型实现运算符重载的代理模式?
从答案中,@James Kanze 按返回类型显示了运算符重载的实现,如下所示:
然后我在没有代理的情况下实现自己的:
我不明白为什么要使用代理?
我知道 Proxy 是一种设计模式,但无论如何我都想不出我必须在这里使用这样的设计模式。
任何人都可以使用具体的例子证明代理是必须的吗?
javascript - 代理扩展 HTMLElement 的 WebComponent 的构造函数
因此,在我创建的使用自定义元素的库中,您显然需要在CustomElementsRegistry
实例化它之前定义类。
截至目前,这正在通过装饰器解决:
这可行,但是,我想在类的实例化时自动注册自定义元素(这样作者就不必将装饰器添加到他们编写的每个组件中)。这可以通过Proxy
.
但是,我的问题是,当我尝试在构造函数上使用 Proxy 并尝试返回目标实例时,我仍然得到Illegal Constructor
,就好像该元素从未在注册表中定义过一样。
这显然与我在代理内部实例化类的方式有关,但我不确定如何做到这一点。我的代码如下:
请在最新的 Chrome 中运行:
MyElement
我怎样才能继续代理内部的继承链,而不会丢失我正在实例化类以使其不会引发Illegal Constructor
异常这一事实的上下文?
javascript - ES6 代理 - 是否可以在调用空对象之前捕获方法?
我正在使用一个 API,该 API 在用户提交数据之前返回用于验证表单的模式。
例如,该模式有一个User
具有名为 的属性的类email
。如果有错误,则User.validators.getEmailErrors()
返回Array
所有错误中的一个,例如['Email address cannot be blank', 'Email addresses must match']
。
但是,如果该字段有效且未发现错误,则getEmailErrors()
返回null
。
在我的应用程序中,我想安全地链接更多方法getEmailErrors()
,例如getEmailErrors().join(',')
,但不事先检查null
。相反,有没有办法(例如使用 ES6 代理)来getEmailAddress()
了解它是否会返回一个Array
,并安全地忽略任何方法join()
,例如它返回的情况null
?
Array
简单的解决方案是在有效的情况下返回一个空而不是null
,但假设我无法更改它。
javascript - 混合构造函数并在 Javascript 代理对象上应用陷阱
我有一个要应用代理的类,观察方法调用和构造函数调用:
计算器.js
index.js
调用此方法时,我希望输出为:
对象实例化
方法调用
但是,apply 没有被调用,我认为这是因为我将代理附加到 Calculator 类,而不是实例化的对象,因此不知道apply
陷阱。
我如何构建一个包罗万象的代理来“观察”方法调用和构造函数调用。
javascript - 在 JavaScript 中实现代理时将方法委托给父级
在Node.js 设计模式的示例中
当原型链已设置时将自动调用来自原始对象的方法时, 方法委托需要重新定义Proxy.prototype.goodbye方法,即Proxy.prototype = Object.create(proto)。提前致谢。
c++ - 对于代理容器上的迭代器来说,什么是“最糟糕的实现”?
语境
我试图实现一个像容器一样的 nD 数组。可以包装底层序列容器并允许将其作为容器容器处理的东西 (of...):arr[i][j][k]
应该是_arr[(((i * dim2) + j) * dim3) + k]
.
好的,直到那里,arr[i]
只需成为子数组的包装类......
当我尝试实现交互器时,我突然意识到周围到处都是龙:
- 我的容器不是符合标准的容器,因为
operator []
返回的是代理或包装器而不是真正的引用(容器何时不是容器?) - 这会导致迭代器要么是一个存储迭代器(已知是坏的(在自定义迭代器上应用 reverse_iterator及其接受的答案后引用失效)
- ...或不一定更好的代理迭代器(To Be or Not to Be (an Iterator))
真正的问题是,一旦你有一个代理容器,没有迭代器可以遵守前向迭代器的以下要求:
前向迭代器 [forward.iterators]
...
6如果a
和b
都是可解引用的,那么a == b
当且仅当*a
和*b
绑定到同一个对象。
示例来自标准库本身:
vector<bool>
众所周知,它不尊重容器的所有要求,因为它返回代理而不是引用:类向量 [vector.bool]
...
3不要求将数据存储为 bool 值的连续分配。建议使用空间优化的位表示。
4引用是模拟向量中单个位的引用行为的类。文件系统路径迭代器被称为存储迭代器:
path iterators [fs.path.itr]
...
2 path::iterator 是一个常量迭代器,它满足双向迭代器 (27.2.6) 的所有要求,除了对于可解引用的迭代器a
和b
带有 的 path::iterator 类型a == b
,不要求*a
和*b
绑定到同一个对象。并来自cppreference:
注意: std::reverse_iterator 不适用于返回对成员对象的引用的迭代器(所谓的“存储迭代器”)。存储迭代器的一个例子是 std::filesystem::path::iterator。
问题
我目前找到了很多关于为什么代理容器不是真正的容器以及如果标准允许代理容器和迭代器会很好的参考资料。但我仍然不明白什么是最好的,什么是真正的限制。
所以我的问题是为什么代理迭代器真的比存储迭代器更好,以及它们中的任何一个都允许哪些算法。如果可能的话,我真的很想为这种迭代器找到一个参考实现
作为参考,我的代码的当前实现已在Code Review上提交。它包含一个存储迭代器(当我尝试使用时立即中断std::reverse_iterator
)
python - 带有猴子补丁方法的实例代理
我需要一种方法来为具有猴子修补方法/字段的实例创建“代理”。
- 我不想使用上下文管理器和/或直接修改实例。
- 我不能使用继承——我得到了一个实例,就是这样。
你知道任何使它成为可能的包吗?
这是我非常粗略的尝试,显示了我需要的功能: