我会选择不同的方法。任何一个
- 使用其他人建议的多态性,扩展 Element 以添加 print() 方法(可以被子类覆盖)或
- 定义一个辅助接口并结合使用策略和工厂模式:
基类
public class Element{}
派生类
public class SubElement extends Element{}
打印元素的帮助界面
public interface PrintHelper{
void print(Element element);
}
工厂为给定元素获取最佳 PrintHelper
public class PrintHelperFactory{
private final Map<Class<? extends Element>, PrintHelper> registeredHelpers =
new HashMap<Class<? extends Element>, PrintHelper>();
// Register a PrintHelper for a given Element class.
public void registerHelper(final Class<? extends Element> clazz,
final PrintHelper helper){
this.registeredHelpers.put(clazz, helper);
}
// Get the most specific PrintHelper for a given Element.
public PrintHelper getHelperForElement(final Element element){
Class<? extends Element> clazz = element.getClass();
while(!Object.class.equals(clazz)){
if(this.registeredHelpers.containsKey(clazz)){
return this.registeredHelpers.get(clazz);
}
clazz = (Class<? extends Element>) clazz.getSuperclass();
}
return null;
}
}
客户端测试类,作为 Java 应用程序运行
public class Main{
public static void main(final String[] args){
final PrintHelperFactory factory = new PrintHelperFactory();
factory.registerHelper(Element.class, new PrintHelper(){
@Override
public void print(final Element element){
System.out.println("Element");
}
});
factory.registerHelper(SubElement.class, new PrintHelper(){
@Override
public void print(final Element element){
System.out.println("Sub Element");
}
});
// test it with an Element
final Element elem = new Element();
factory.getHelperForElement(elem).print(elem);
// test it with a sub class
final Element sub = new SubElement();
factory.getHelperForElement(sub).print(sub);
}
}
输出
Element
Sub Element