這取決於。在你的情況下,沒有一個。但通常你會通過某種形式的多態或模板方法模式來解決這個問題。但是你的數據模型似乎並沒有被設計成這樣,所以你幾乎搞砸了,你將不得不做一個醜陋的嵌套IF結構。或者,您可以稍微重構它並使用模板方法模式。在這種情況下,您可以使用Factory方法模式根據字符串創建不同的模板,這些模板中的每一個都會有不同的TemplateMethod()
,這些模板將被調用。這允許您平等對待所有對象,但是隻有一個部分(模板方法)獨立行事。
對於更深入的說明,請參見:http://en.wikipedia.org/wiki/Template_method_pattern
編輯:添加例如,更少低劣工廠方法。
TemplateFactory.java
public class TemplateFactory {
private Map<String, Class> map;
public TemplateFactory() {
this.map = new TreeMap<>();
map.put("Template 1", Template1.class);
map.put("Template 2", Template2.class);
}
public BaseTemplate createBaseTemplate(String comparison)
{
if (!map.containsKey(comparison))
{
return null;
}
try {
return (BaseTemplate) map.get(comparison).getConstructor().newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
return null;
}
public static void main(String[] args) {
TemplateFactory tf = new TemplateFactory();
BaseTemplate t1 = tf.createBaseTemplate("Template 1");
BaseTemplate t2 = tf.createBaseTemplate("Template 2");
System.out.println(t1.templateMethod(""));
System.out.println(t2.templateMethod(""));
}
}
BaseTemplate.java
public abstract class BaseTemplate {
public String doSomething()
{
// whatever
return "Hello";
}
public int anotherRealMethod(String data)
{
//also whatever
return 0;
}
public abstract String templateMethod(String data);
}
Template1.java
public class Template1 extends BaseTemplate {
@Override
public String templateMethod(String data) {
return "Template 1";
}
}
模板2.java
public class Template1 extends BaseTemplate {
@Override
public String templateMethod(String data) {
return "Template 2";
}
}
你能否提供更多細節? '條件是基於字符串比較'的?請舉例 –
這個問題太廣泛了。根據需要,您可能會考慮使用有限狀態機或其他技術。 – user3159253
只是想澄清,你爲什麼需要這樣做?方法名是否足夠?通過字符串引用方法對我來說是雙倍的工作。 –