网络知识 娱乐 访问者设计模式——简单的方法

访问者设计模式——简单的方法

访问者设计模式——简单的方法


访问者设计模式——简单的方法

举个例子来更好地理解事情。考虑如下的Animal接口。

访问者设计模式——简单的方法

假设我们有这个 Animal 接口的实现,比如DogCatBird类,如下所示。

访问者设计模式——简单的方法

访问者设计模式——简单的方法

访问者设计模式——简单的方法

现在,假设将来我们希望向 Animal 接口添加更多方法,例如Relax ()、makeSound() 。此更改将要求我们更改Animal接口的所有实现/子类,因此违反了SOLID设计原则。Animal 接口是不可扩展的,因为每当我们向它添加方法时,它都会破坏其他类。作为一个好的设计原则,我们应该始终“封装变化”

注意:封装我只是指提取到它自己独立的类/接口。

访问者设计模式——简单的方法

现在我们想要添加到Animal接口的新方法变成了AnimalVisitor接口的实现,如下所示。

访问者设计模式——简单的方法

访问者设计模式——简单的方法

现在我们已经扩展了Animal接口的功能,而不需要修改它。问题变成了“Animal 界面将如何使用这个新界面?他们是怎么联系起来的?” . 为此,我们在Animal接口中添加了一个方法,该方法带有一个参数,允许我们将Animal对象传递给Visitor类。

访问者设计模式——简单的方法

注意:这也会破坏子类的功能,但这将是一次性更改

更新子类如下,

访问者设计模式——简单的方法

访问者设计模式——简单的方法

访问者设计模式——简单的方法

您可能会想,如果我们要在 Dog、Cat、Bird 类中使用相同的代码,为什么不在Animal接口中使用默认方法。好主意,但这不起作用,因为 Java 编译器不知道指的是哪个类,并且会要求将类型转换为 3 个子类(Dog、Cat、Bird)之一,如下所示。

访问者设计模式——简单的方法

注意: 默认方法是JAVA-8的一部分。如果您不熟悉 Java-8,那么可以将Animal 接口替换为抽象类,并将此accept()方法视为非抽象方法。

访问者设计模式——简单的方法

当我们运行 main() 方法时,我们得到以下输出。

访问者设计模式——简单的方法

正如我们所见,我们使用了一个Visitor扩展现有接口(即Animal)的功能。现在假设将来我们要添加一些其他方法,比如move()。我们只需要添加一个新类,实现AnimalVisitor接口的Move 。

访问者设计模式——简单的方法

而且我们不需要对 Animal 或其任何子类进行任何其他更改。我们可以直接在 main() 方法中使用Move

访问者设计模式——简单的方法

当我们运行 main() 方法时,我们得到以下输出。

访问者设计模式——简单的方法

如我们所看到的,扩展现有代码的功能变得更容易,而无需进行很多更改,这就是访客模式。它允许您扩展现有对象集的功能,而无需修改它们。总结一下访问者模式的基本作用,我们不是直接向我们想要扩展的类/接口(在我们的例子中是 Animal)添加方法,而是在Animal中创建一个方法,该方法接受一个访问者对象并传递当前对象(当前Animal的实例,即Dog/Cat/Bird)使用“ this” 以便访问者可以使用该对象为其添加功能。

Spring中能够找到该模式的应用,如BeanDefinitionVisitor