Java 访问者模式而不是 instanceof 开关

发布于 2024-12-22 01:19:27 字数 422 浏览 1 评论 0原文

在这个 问题 中,据说我可以使用访问者模式而不是一堆 instanceof s。 Jmg 说:“如果您不能随意更改 A、B 和 C,您可以应用访问者模式来实现相同的目的。”

据我了解,我仍然需要让 A、B 和 C 支持访问者(例如,有一个 accept() 方法)。

我的问题是我绝对不可能更改 A、B 和 C。我只是从外部库获取 Car 对象,并且必须调用特定于卡车、赛车和公共汽车的 wash() 方法。

我想我仍然需要一个带有 instanceofif-else-if 构造。我说得对吗?

In this question it is said I can use visitor pattern instead of a bunch of instanceofs. 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-ifconstruction with instanceofs. Am I right?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

半边脸i 2024-12-29 01:19:27

是的,要实现访问者模式,现在您需要访问 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。

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:

Note: A more flexible approach to this pattern is to create a wrapper class implementing the interface defining the accept method. The wrapper contains a reference pointing to the CarElement which could be initialized through the constructor. This approach avoids having to implement an interface on each element. [see article Java Tip 98 article below]

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文