在这个question中,据说我可以使用访客模式而不是一堆instanceof
。 Jmg说:“如果你不能自由改变A,B和C,你可以应用访客模式来实现同样的目标。”
据我了解,我仍然需要制作A,B和C支持访问者(例如,使用accept()
方法)。
我的问题是我绝对没有可能改变A,B和C.我只是从外国图书馆获得Car对象,并且必须调用专用于卡车,赛车和公共汽车的wash()
方法。
我认为我仍需要if-else-if
构建instanceof
。我是对的吗?
答案 0 :(得分:10)
是的,要实现访问者模式,您现在需要访问A,B和C的源,除非所有类具有相同的签名(因此所有类都具有相同名称的wash()方法)。如果是这种情况,您可以使用多态来调用正确的方法。
否则,可以在源代码级别向您无权访问的类添加功能。关于访客模式的维基百科文章(http://en.wikipedia.org/wiki/Visitor_pattern),Java示例下方有一个小脚注:
注意:这种模式的一种更灵活的方法是创建一个包装器类,实现定义accept方法的接口。包装器包含一个指向CarElement的引用,可以通过构造函数初始化它。这种方法避免了必须在每个元素上实现接口。 [见下文Java Tip 98文章]
它引用了这篇文章:http://www.javaworld.com/javaworld/javatips/jw-javatip98.html
所以,总而言之,它是可能的,但它为你想做的小任务提供了大量的课程。如果我是你,我会坚持使用instanceof。