.
- use polymorphism as suggested by others, add an element to add the print () method (which can be overwritten by subclasses) or
- Define a helper interface and use a combination of strategy and factory pattern:
Base class
public class Element{}
Derived class
public class SubElement extends Element{}
Helper interface for printing items
public interface PrintHelper{
void print(Element element);
}
Factory to get the best PrintHelper for this item
public class PrintHelperFactory{
private final Map<Class<? extends Element>, PrintHelper> registeredHelpers =
new HashMap<Class<? extends Element>, PrintHelper>();
public void registerHelper(final Class<? extends Element> clazz,
final PrintHelper helper){
this.registeredHelpers.put(clazz, helper);
}
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;
}
}
Client test class running as a Java application
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");
}
});
final Element elem = new Element();
factory.getHelperForElement(elem).print(elem);
final Element sub = new SubElement();
factory.getHelperForElement(sub).print(sub);
}
}
Output
Element
Sub Element
source
share