访问者模式是一种行为设计模式,它允许在不改变主题对象的情况下,对主题对象进行访问。下面是一个使用 Java 编写访问者模式的示例代码,演示了动物园中的动物参观功能。
// 主题接口
interface Animal {
void accept(Visitor visitor);
}
// 具体主题实现
class Lion implements Animal {
@Override
public void accept(Visitor visitor) {
System.out.println("Lion is visited by " + visitor.getName());
}
}
class Elephant implements Animal {
@Override
public void accept(Visitor visitor) {
System.out.println("Elephant is visited by " + visitor.getName());
}
}
class Zoo {
private List<Animal> animals;
public Zoo() {
animals = new ArrayList<>();
animals.add(new Lion());
animals.add(new Elephant());
}
public void addAnimal(Animal animal) {
animals.add(animal);
}
public void visitAnimals(Visitor visitor) {
for (Animal animal : animals) {
animal.accept(visitor);
}
}
}
// 访问者接口
interface Visitor {
void visit(Animal animal);
}
// 具体访问者实现
class ZooVisitor implements Visitor {
private String name;
public ZooVisitor(String name) {
this.name = name;
}
@Override
public void visit(Animal animal) {
animal.accept(this);
}
public void printVisitedAnimals() {
System.out.println("Visited animals:");
}
}
public class VisitorPatternDemo {
public static void main(String[] args) {
Zoo zoo = new Zoo();
ZooVisitor visitor = new ZooVisitor("John");
zoo.visitAnimals(visitor);
visitor.printVisitedAnimals();
}
}
在这个示例中,我们定义了一个 Animal 接口,表示动物园中的动物。然后我们创建了两个具体的状态实现 Lion 和 Elephant,分别表示狮子和象。Zoo 类包含了 Animal 接口,并持有一个 animals 变量,表示当前动物园中的动物。Zoo 类还提供了 addAnimal 和 visitAnimals 方法,这些方法都委托给当前动物对象来处理。
在 VisitorPatternDemo 类的 main 方法中,我们创建了一个 Zoo 对象,并首先添加了狮子和象两种动物。然后我们创建了一个 ZooVisitor 对象,并将其传入 visitAnimals 方法进行动物参观。最后,我们调用 printVisitedAnimals 方法打印已访问的动物。