大家想必写过类似这样的代码:
if () {}
else if() {}
else if(){}
......
当条件多时代码显得非常冗长,而且每次添加条件时需要修改主流程的代码。这样就破坏了类的开闭原则。基于此,我们可以采用另一种比较优雅的实现方式,
首先,定义一个接口, 这个接口很重要,是用来替代if-else的关键。
interface ISerivice<K, V> {
String getName();
K doSomething(V v);
}
接着, 定义一个示例类
public class1 implements ISerivice<String, Integer>{
private String name = "class1";
public String doSomething(Integer param){
System.out.println("我是class1");
}
public String getName() {
return name;
}
}
下一步,写初始化的代码,将实现了IService接口的类(Class对象)都放进map中,key为name.
Reflections reflections = new Reflections("此处应有包名");
Iterator<Class<? extends Service>> classes
= reflections.getSubTypesOf(IService.class).iterator();
while(classes.hasNext()){
Class<? extends IService> class= classes.next();
// class.newInstance() 建议用工厂方法实现或者交给spring拖管
map.put(class.newInstance().getName(), class);
}
如果要用到某个类,只需要给出类的name属性即可得到该类的Class对象。接下来就是调用doSomething()方法了。
那么如果以后要再加一个类Class2怎么办呢,很简单,只需要这样:
public class1 implements ISerivice<String, Integer>{
private String name = "class2";
public String doSomething(Integer param){
System.out.println("我是class2");
}
public String getName() {
return name;
}
}
然后:
map.get(“class2”) 就可以得到相应的Class对象了。