Java访问者模式扩展特性

本文关键字:扩展 模式 访问者 Java | 更新日期: 2023-09-27 18:16:35

我在研究访问者模式时遇到了这个有用的例子: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; }
}

它可以工作,但是比起这种琐碎的修改有什么好处呢?

抽象类Fruit

{
    public abstract void Accept(IFruitVisitor visitor);
    public abstract double Price { get; }
}
我不明白他在说什么。我的意思是,如果他现在想要实现"价格"特性,那么必须对现有代码进行哪些更改/添加(基于这种模式方法)?div =

您引用的答案错过了访问者的许多要点。它说"访问者被用来在不牺牲类型安全的情况下实现类型测试",这是完全错误的。GOF的书中说"访问者可以让你定义一个新的操作,而不需要改变它所操作的元素的类"。当然,访问者可以用于测试对象的类型以外的东西,以及在不涉及测试的对象上执行操作。

"Visitor is overkill"是经常被提及的,但通常是那些试图用Visitor来做它不打算做的事情的人说的,然后发现-惊讶-它并没有真正起作用。

海报是正确的,他们引用的第二段代码是实现功能的一种更简单的方法,但它忽略了一点,即访问者是针对不想修改Fruit类的情况。

Java访问者模式扩展特性

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

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

现在,FruitPrice是否有意义是另一个问题。Item有一个价格,Item有一个Fruit,或者Fruit成为Item的子类,或者它们是复合的,或者…