Java 访问者模式而不是 instanceof 开关
在这个 问题 中,据说我可以使用访问者模式而不是一堆 instanceof
s。 Jmg 说:“如果您不能随意更改 A、B 和 C,您可以应用访问者模式来实现相同的目的。”
据我了解,我仍然需要让 A、B 和 C 支持访问者(例如,有一个 accept()
方法)。
我的问题是我绝对不可能更改 A、B 和 C。我只是从外部库获取 Car 对象,并且必须调用特定于卡车、赛车和公共汽车的 wash()
方法。
我想我仍然需要一个带有 instanceof
的 if-else-if
构造。我说得对吗?
In this question it is said I can use visitor pattern instead of a bunch of instanceof
s. Jmg said "If you are not free to change A, B, and C, you could apply the visitor pattern to achieve the same."
As far as I understand I still have to make A, B and C support visitor (have an accept()
method, for example).
My problem is I have absolutely no possibility to change A, B and C. I just get the Car object from the foreign library and have to call wash()
method specific for trucks, race cars and buses.
I think I still need an if-else-if
construction with instanceof
s. Am I right?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
是的,要实现访问者模式,现在您需要访问 A、B 和 C 的源代码,除非所有类都具有相同的签名(因此所有类都具有同名的 Wash() 方法)。如果是这种情况,您可以使用多态性来调用正确的方法。
否则,可以向您在源代码级别无权访问的类添加功能。关于访客模式的维基百科文章 (http://en.wikipedia.org/wiki/Visitor_pattern) Java 示例下面有一个小脚注:
它引用了这篇文章:https://www.infoworld.com/article/2077602/java-tip-98--reflect-on-the-visitor-design-pattern.html
所以,总而言之,这是可能的,但是它为您想要完成的小任务提供了大量的类。如果我是你,我会坚持使用instanceof。
Yes, to implement the visitor pattern now you need access to the source of A, B and C, unless all the classes have the same signature (so all have the wash() method with the same name). If that's the case, you can use polymorphism to call the correct method.
Otherwise, it is possible to add functionality to classes you don't have access to at source code level. On the Wikipedia article on the Visitor pattern (http://en.wikipedia.org/wiki/Visitor_pattern) there is a small footnote below the Java example:
It references this article: https://www.infoworld.com/article/2077602/java-tip-98--reflect-on-the-visitor-design-pattern.html
So, all in all it's possible, but it gives an enormous number of classes for the small task you want to do. I'd stick with the instanceof's if I were you.