- 使用if/else的方式,通过对方法名的判断,调用对应的方法
优点:写法简单,逻辑简单
缺点:每新增一个方法,需要新增一个if/else判断,工作量较大
- 使用反射获取目标对象所有的公共Method对象,遍历Method对象,将方法名称和Method对象存入Map集合,通过方法名获取Method对象,调用目标对象执行
优点:代码优雅,有较好的扩展性
缺点:逻辑复杂
代码实现:
import org.apache.commons.codec.binary.StringUtils;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
/**
* 通过方法名,调用目标对象的方法。2种实现方式的比较
**/
public class MethodFactory {
/**
* --------------------------------------------------
* 使用if/else的方式,通过对方法名的判断,调用对应的方法
* 优点:写法简单,逻辑简单
* 缺点:每新增一个方法,需要新增一个if/else判断,工作量较大
* --------------------------------------------------
*/
public static void method(MethodObject methodObject, String methodName){
if(StringUtils.equals(methodName, "method0")){
methodObject.method0();
} else if(StringUtils.equals(methodName, "method1")){
methodObject.method1();
} else if(StringUtils.equals(methodName, "method2")){
methodObject.method2();
} else if(StringUtils.equals(methodName, "method3")){
methodObject.method3();
}
}
/**
* --------------------------------------------------
* 使用反射获取目标对象所有的公共Method对象,遍历Method对象,将方法名称和Method对象存入Map集合,通过方法名获取Method对象,调用目标对象执行
* 优点:代码优雅,有较好的扩展性
* 缺点:逻辑复杂
* --------------------------------------------------
*/
private static final Map<String, Method> methodMaps = new HashMap<>();
public static void build(){
Class methodClass = MethodObject.class;
Method[] methods = methodClass.getDeclaredMethods();
if(methods.length == 0){
return ;
}
for(Method method : methods){
String methodName = method.getName();
methodMaps.put(methodName, method);
}
}
public static Method getMethod(String key){
return methodMaps.get(key);
}
public static void main(String[] args){
MethodObject methodObject = new MethodObject();
System.out.print("if/else: ");
method(methodObject, "method1");
System.out.print("动态扩展: ");
build();
Method method0 = getMethod("method1");
try {
method0.invoke(methodObject, new Object[]{});
}catch (Exception e){
e.printStackTrace();
}
}
}