0

我正在研究访问者模式,我想知道这种模式与开放/封闭原则有何关系。我在几个网站上读到“这是遵循开放/封闭原则的一种方式。 ”(引自维基百科)。

另一个网站上,我了解到这是遵循开放/封闭原则的方式,以便可以轻松地将新访问者添加到您的程序中,以便“在不更改现有代码的情况下扩展现有功能”。同一个网站提到这种访问者模式有一个主要缺点:“如果将一个新的可访问对象添加到框架结构中,则所有实现的访问者都需要修改。 ”使用 Java 的反射框架提供了解决此问题的方法。

现在,这个解决方案不是有点像黑客解决方案吗?我的意思是,我也在其他一些博客上找到了这个解决方案,但是代码看起来更像是一种解决方法!

对于向访问者模式的现有实现添加新可访问对象的问题,是否有另一种解决方案?

4

2 回答 2

1

访问者是所有模式中最繁琐的模式之一,并且具有您提到的不可扩展性方面的缺点。将双重分派引入单分派语言本身就是一种草率的解决方法。当你考虑到它的所有缺点时,诉诸反思并不是一个可怕的选择。

事实上,反射在任何情况下都不是一个非常糟糕的选择:考虑一下今天的代码有多少是用动态语言编写的,换句话说,只使用反射,应用程序不会因此而崩溃。

类型安全当然有它的优点,但是当你发现自己遇到了静态类型和单一调度的障碍时,不要后悔地拥抱反射。还要注意,通过适当的Method对象缓存,反射方法调用几乎与静态调用一样快。

于 2013-08-03T17:37:22.340 回答
0

这取决于访问者应该完成的工作,但在大多数情况下,这就是interfaces 的用途。考虑一个SortedSet;实现需要能够比较集合中的不同对象以了解它们的顺序,但它不需要了解有关对象的任何其他内容。解决方案(按自然顺序排序)是使用Comparable接口。

于 2013-08-03T17:18:59.207 回答