【问题标题】:Proxy Pattern and the Holder Pattern代理模式和持有者模式
【发布时间】:2014-03-21 03:21:10
【问题描述】:

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

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

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

    B.允许一个对象引用另一个频繁更改的对象并向其发送消息

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

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

    B.允许一个对象引用另一个频繁更改的对象并向其发送消息

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

【问题讨论】:

  • 我不知道持有人模式:(当我用谷歌搜索时它会跳转代理

标签: java design-patterns


【解决方案1】:

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

【讨论】:

  • 所以我的答案与问题中的其他答案完全相反:P 但是,我只是觉得这个问题问得不好,因为没有一个答案真正描述了模式的目标
【解决方案2】:

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

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

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

【讨论】:

  • 然而,使用 mutator/accessor(又名 setter/getter)绝不是代理的目的。只是好奇,对于所谓的Holder,它是指Java中的StringHolder之类的东西吗?如果是这样,这两个答案似乎都不正确。
  • @AdrianShum 这本教科书在谈到持有人模式时通常使用 ColorHolder,所以我认为答案是相对的。
  • @Jan 因此,说代理模式和持有者模式实现相同的事情是正确的(访问 getters/setters/member 函数)并且在代理模式中,“代理对象”不会改变,但在持有人这里的模式必须为“代理对象”的运行时修改提供?
猜你喜欢
  • 1970-01-01
  • 2011-10-12
  • 2013-09-08
  • 2011-04-15
  • 2012-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多