我的教科书中有几个问题对我来说有点棘手:
“代理模式最好用以下哪个语句来描述”
一个。允许通过访问器/ mutator方法访问组件
B中。允许对象引用并将消息发送到另一个经常更改的对象
“持有人模式最好用以下哪种陈述来描述?”
一个。允许通过访问器/ mutator方法访问组件
B中。允许对象引用并将消息发送到另一个经常更改的对象
我认为问题1的答案是B,问题2的答案是A.我认为这些答案是因为代理模式提供了对对象(不是组件)的访问权限另一个对象是通过使用accessor和mutator方法。但是我不确定并想知道正确的答案。
答案 0 :(得分:2)
我试着搜索一下所谓的Holder模式(我找到了cs.brown.edu/courses/cs015/lectures/DesignPattern.pptx,其中包含OP在评论中提到的“ColorHolder”,我敢打赌他们指的是同样的事情)。以下是我对这个问题的看法:
问题1:
这两个答案都没有描述代理的目标。代理的主要目的是为访问另一个对象提供一个间接级别。这种间接有多种原因:我们希望提供代理对象的某些特征子集,或者我们想使远程对象看起来像本地对象等。答案A是不合理的,因为访问者/ mutator(getter / setter) )永远不是代理的目标。答案B是不合理的,因为代理对象是否经常变化不是代理的主要原因。
然而答案B似乎更接近于Proxy的目的,因为它提到了“另一个对象”,它是Proxy的一个非常重要的元素。
问题2:
所谓的Holder模式不是一般模式。它只是一种处理不可变对象+值传递约束的模式。
假设我想调用方法void foo(Bar bar)
并且我希望foo更改bar参数,并且我希望这样的更改对调用者可见。因为Java(和一些类似的语言)只允许按值传递,所以我们不能将bar引用更改为指向另一个对象。如果bar是不可变的,我们也失去了直接改变bar状态的可能性。在这种情况下,我们制作一个所谓的Holder,它为你提供getter和setter,让foo
方法能够“改变”调用者可见的bar的引用。
另一个用途是我们想要几个obj来引用相同的值。如果每个obj单独引用该值,如果我通过对象1更改值,则对其他“引用”对象不可见。因此,持有者充当间接的额外水平:所有obj指的是持有者,并且这种引用永远不会改变。我们通过更改Holder持有的值来更改该值。
(在C / C ++中,它可以通过简单地指向指针来完成)
这两个答案都没有最好地描述这种用法,但A更接近,因为getter / setter(又名访问者/ mutator)是Holder通常提供的。
答案 1 :(得分:1)
您的老师可能想听到的是1A 2B。
两种模式都做非常类似的事情,但持有者模式用于提供对频繁变化的对象引用的持续访问。
简而言之,代理模式只是访问不同的对象,而持有者模式的存在是为了访问它当时拥有的任何对象。