我试图搜索一下所谓的 Holder 模式(我发现 cs.brown.edu/courses/cs015/lectures/DesignPattern.pptx 包含 OP 在评论中提到的“ColorHolder”,我敢打赌他们指的是同样的事情)。以下是我对这个问题的看法:
问题一:
这两个答案都没有描述 Proxy 的目标。代理的主要目的是为访问另一个对象提供一定程度的间接性。这种间接的原因有很多:我们想提供代理对象的某些特性子集,或者我们想让远程对象看起来像本地对象,等等。答案 A 不合理,因为访问器/修改器(getter/setter ) 从来都不是 Proxy 的目标。答案 B 也不合理,因为被代理对象是否频繁变化从来都不是代理的主要原因。
但是答案 B 似乎更接近 Proxy 的目的,因为它提到了“另一个对象”,这是 Proxy 的一个非常重要的元素。
问题2:
所谓的 Holder 模式不是一般的模式。它只是一种处理不可变对象+按值传递约束的模式。
假设我想调用方法void foo(Bar bar)
并且我希望 foo 更改 bar 参数,并且我希望这样的更改对调用者可见。因为 Java(和一些类似的语言)只允许按值传递,所以我们不能将 bar 引用更改为指向另一个对象。如果把 bar 做成不可变的,我们也失去了直接改变 bar 状态的可能性。在这种情况下,我们创建了一个所谓的 Holder,它为您提供 getter 和 setter,让该foo
方法能够“更改”调用者可见的 bar 的引用。
另一个用途是我们希望多个 obj 引用相同的值。如果每个 obj 单独引用该值,如果我通过对象 1 更改值,则其他“引用”对象看不到它。因此 Holder 充当了一个额外的间接级别:所有 obj 都指向 Holder 并且这样的引用永远不会改变。我们通过更改 Holder 持有的值来更改值。
(在 C/C++ 中,它可以通过简单的指针来完成)
这两个答案都不能最好地描述这种用途,但 A 更接近一些,因为 getter/setter(又名访问器/突变器)是 Holder 通常提供的。