访问者模式与开放/封闭原则:如何添加新的可访问对象?

时间:2013-08-03 17:03:58

标签: java visitor-pattern open-closed-principle

我正在研究访客模式,我想知道这种模式是如何与开放/封闭原则相关的。我在几个网站上看到“这是遵循开放/封闭原则的一种方式。”(摘自wikipedia)。

another website我了解到这是遵循开放/封闭原则的方式,这样就可以轻松地为程序添加新访问者,以“扩展现有功能而无需更改现有代码”。同一个网站提到这个访问者模式有一个主要缺点:“如果在框架结构中添加了一个新的可访问对象,则需要修改所有已实现的访问者。”此问题的解决方案由使用Java的Reflection框架。

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

是否有另一种解决方案可以将新的访问者添加到访问者模式的现有实现中?

2 个答案:

答案 0 :(得分:1)

访客是所有模板中最常见的模式之一,并且具有您提及的不可扩展性的缺点。将双重调度引入单一调度语言本身就是一种草率的解决方法。当你考虑到它的所有缺点时,采用反射并不是一个糟糕的选择。

事实上,反思在任何情况下都不是一个非常糟糕的选择:考虑今天的代码用动态语言编写多少,换句话说使用反射,并且应用程序不会掉落除此之外。

当然,类型安全有其优点,但是当你发现自己遇到了静态打字和单一调度的墙壁时,拥抱反射而没有悔恨。另请注意,通过适当缓存Method个对象,反射方法调用几乎与静态调用一样快。

答案 1 :(得分:0)

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