2

我教科书中的几个问题对我来说有点棘手:

  1. “代理模式最好用以下哪个陈述来描述”

    A. 允许通过访问器/修改器方法访问组件

    B. 允许一个对象引用和发送消息给另一个经常变化的对象

  2. “持有人模式最好用以下哪个陈述来描述?”

    A. 允许通过访问器/修改器方法访问组件

    B. 允许一个对象引用和发送消息给另一个经常变化的对象

我认为问题 1 的答案是 B,问题 2 的答案是 A。我认为这些答案是因为代理模式通过使用访问器和修改器方法提供了对一个对象(而不是组件)对多个其他对象的访问。但是我不确定,想知道正确的答案。

4

2 回答 2

3

我试图搜索一下所谓的 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 通常提供的。

于 2013-07-03T01:44:20.620 回答
1

你的老师可能想听到的是 1A 2B。

两种模式做的事情非常相似,但持有者模式用于提供对频繁更改的对象引用的持续访问。

简而言之,代理模式只是访问一个不同的对象,而持有者模式的存在是为了访问它当时持有的任何对象。

于 2013-07-03T01:03:37.737 回答