Java访问者模式替代instanceof开关

10
在这个问题中说我可以使用访问者模式来代替一堆instanceofs。Jmg说:“如果你不能自由更改A、B和C,你可以应用访问者模式来实现相同的效果。”
据我所知,我仍然必须使A、B和C支持访问者(例如有一个accept()方法)。
我的问题是我绝对没有可能更改A、B和C。 我只能从外部库中获取Car对象并调用特定于卡车、赛车和公共汽车的wash()方法。
我认为我仍然需要一个if-else-if结构,并且需要使用instanceofs。 我的判断正确吗?

请参见https://dev59.com/MGYq5IYBdhLWcg3w2UQU。 - Raedwald
请参见https://dev59.com/QHXYa4cB1Zd3GeqP86yJ。 - Raedwald
1个回答

10

是的,要实现访问者模式现在需要访问A、B和C的源代码,除非所有的类都具有相同的签名(所以所有的类都有相同名称的wash()方法)。如果是这种情况,你可以使用多态性来调用正确的方法。

否则,在没有源代码级别上访问某些类的情况下,可以向这些类添加功能。在维基百科关于访问者模式的文章中(http://en.wikipedia.org/wiki/Visitor_pattern),在Java示例下面有一个小脚注:

注意:更灵活的方法是创建一个包装器类来实现定义接受方法的接口。包装器包含一个引用,指向可以通过构造函数进行初始化的CarElement。这种方法避免了在每个元素上实现接口。[参见下面的Java Tip 98文章]

它引用了这篇文章:https://www.infoworld.com/article/2077602/java-tip-98--reflect-on-the-visitor-design-pattern.html

总之,虽然这是可能的,但对于你想完成的小任务来说,它会产生大量的类。如果我是你,我会坚持使用instanceof。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接