【问题标题】:Java visitor pattern extending featuresJava 访问者模式扩展特性
【发布时间】:2012-04-01 23:38:02
【问题描述】:

我在研究访问者模式时遇到了这个有用的例子:https://stackoverflow.com/a/2604798/974594。这篇文章很清楚,很容易理解,虽然我在理解最后一部分时遇到了问题,从这里开始:

话虽如此,访问者通常是矫枉过正的,而且他们有 倾向于使 API 变得非常复杂,并且可能非常麻烦 为每一种新的行为定义一个新的访问者。

通常,应该使用更简单的模式(如继承)来代替 访客。例如,原则上我可以编写如下类:

class FruitPricer : IFruitVisitor
{
    public double Price { get; private set; }
    public void Visit(Orange fruit) { Price = 0.69; }
    public void Visit(Apple fruit) { Price = 0.89; }
    public void Visit(Banana fruit) { Price = 1.11; }
}

它可以工作,但与这种微不足道的修改相比有什么优势:

抽象类水果

{
    public abstract void Accept(IFruitVisitor visitor);
    public abstract double Price { get; }
}

我没听懂他在说什么。我的意思是,如果他现在想要实现“价格”功能,必须对现有代码进行哪些更改/添加(基于这种模式方法)?=

【问题讨论】:

  • 这个例子不是用Java写的(也许是C#?)
  • 是的,我以 java 为例进行了正确的修改。它被标记为 java idk 为什么
  • @recoInrelax 不知道你做了什么修改使它成为Java-y,它仍然不是。
  • 是的,我不是指代码。我只是从另一个帖子中复制的。伪造语法,基本上他的意思是,虽然第一块代码是实现价格功能的“模式”方式,但与第二块代码相比,它太小题大做了,更容易做到?跨度>
  • 无论你怎么做,这个例子都没有意义... slice 它。

标签: c# design-patterns visitor-pattern


【解决方案1】:

您引用的答案错过了访客的大部分要点。它说“访问者用于在不牺牲类型安全的情况下实现类型测试”,这是完全不正确的。 GOF 书说“访问者让你定义一个新的操作而不改变它操作的元素的类”。访问者当然可以用于在类型以外的事物上测试对象,以及对不涉及测试的对象执行操作。

“Visitor 太过分了”经常被提及,但人们通常会这样说,他们试图将 Visitor 用于它不打算用于的事情,然后发现 - 惊喜 - 它并没有真正起作用。

发帖人说得对,他们引用的第二段代码是实现该功能的一种更简单的方法,但它忽略了当您不想修改 Fruit 类时,Visitor 的用途。

【讨论】:

  • 啊哈不可能更清楚。这个答案就是我所需要的。谢谢
【解决方案2】:

为每个子类添加一个特定于类的价格实现。

关键是有时Visitor 是多余的,可以以不那么抽象的方式添加功能。

现在,Fruit 拥有Price 是否有意义是一个不同的问题。 Item 有一个价格可能更有意义,而Item 有一个Fruit,或者Fruit 成为Item 的子类,或者它们是复合的,或者......

【讨论】:

  • 如果不同的商店以不同的价格出售水果呢?有几十种情况下,微不足道的修改不起作用,那就是您(可能)需要访问者的时候。
  • @DJClayworth ...显然。 IMO 访问者仍然是问题的错误解决方案。我按要求回答了问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-18
  • 2017-12-09
  • 2015-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-05
相关资源
最近更新 更多