gpt4 book ai didi

Java 访问者模式 2

转载 作者:行者123 更新时间:2023-12-02 18:17:43 25 4
gpt4 key购买 nike

这是我已经提出的问题的后续问题,并提供了更好的代码示例:

以下代码使用访问者模式:

class Animal { void accept(Visitor v) { v.visit(this); } }
class Cat extends Animal {}
class Dog extends Animal {}
class Poodle extends Dog {}

interface Visitor {
public void visit(Animal a);
public void visit(Cat a);
public void visit(Dog a);
public void visit(Poodle a);
}

class TalkVisitor implements Visitor {
public void visit(Animal a) { System.out.println("?"); }
public void visit(Cat a) { System.out.println("Meow"); }
public void visit(Dog a) { System.out.println("bark"); }
public void visit(Poodle a) { System.out.println("Arf"); }
}

class WalkVisitor implements Visitor {
public void visit(Animal a) { System.out.println("?"); }
public void visit(Cat a) { System.out.println("Sneak"); }
public void visit(Dog a) { System.out.println("Walk"); }
public void visit(Poodle a) { System.out.println("Skip"); }
}

public class Demo{
public static void main(String []args){
Animal list[] = { new Cat(), new Dog(), new Poodle() };

for (Animal a : list)
a.accept(new TalkVisitor());

for (Animal a : list)
a.accept(new WalkVisitor());
}
}

输出为:

?
?
?
?

如何在不添加 Animal.accept() 内的 instanceof 开关的情况下修复它? (我不想每次添加新的动物类时都维护 switch() )

最佳答案

我认为为抽象类(在您的例子中为 Animal)实现 visit 方法是没有意义的。

在访问者中,您始终知道所有可能的子类型。这是一种基本假设(否则您将向 Visitor 接口(interface)添加新方法)。但是您获得了动态实现不同行为的能力。就你而言,就是说话和走路。

付出的代价是在每个具体类型中实现“accept”方法。您尝试提供更通用的解决方案,但感到困惑:)例如,看一下 Wikipedia描述。

他们谈论的是 Car 的不同部分,但想法是相同的:他们为所有部分实现了一个 accept 方法。

关于Java 访问者模式 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35237890/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com