问题由来:需要大量实现某个功能,需要根据不同链接调用不同方法,并返回类似信息,但是又不同
1.将不同链接抽出一个Enum对象
例:根据不同的链接,返回的内容相似,
根据穿入的是student还是class,返回对应的表的表头和显示的条数
public enum TableHeadEnum {
//简单举例
STUDENT("student","<tr><th>序号</th><th>姓名</th><th>性别</th><th>年龄</th></tr>",5),
CLASS("class","<tr><th>序号</th><th>年级</th><th>班级</th><th>人数</th></tr>",3),
;
/**
* 前台请求的url
*/
private String url;
/**
* 需要查询的表头
*/
private String tableHead;
/**
* 需要显示的数据
*/
private Integer size;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getTableHead() {
return tableHead;
}
public void setTableHead(String tableHead) {
this.tableHead = tableHead;
}
public Integer getSize() {
return size;
}
public void setSize(Integer size) {
this.size = size;
}
TableHeadEnum(String url, String tableHead, Integer size) {
this.url = url;
this.tableHead = tableHead;
this.size = size;
}
//根据不同的url返回不同的 TableHeadEnum 对象
public static TableHeadEnum getTableHeadEnum(String url){
for (TableHeadEnum tableHeadEnum : TableHeadEnum.values()) {
String uurl=tableHeadEnum.url.toLowerCase();
if (url.toLowerCase().equals(uurl)){
return tableHeadEnum;
}
}
return null;
}
}
2.将业务逻辑部分根据URL反射
将所有反射的方法名统一格式,方便拼接调用(也可以在定义enum 的时候加一个方法名的属性)
public String getSuggestions(MessageQuery messageQuery) throws Exception {
TableHeadEnum tableHeadEnum = TableHeadEnum.getTableHeadEnum(messageQuery.getDataUrl());
//得到的enum类为空,直接返回
if (isEmpty(tableHeadEnum)){
return "";
}
messageQuery.setSize(tableHeadEnum.getSize());
//所有的方法是 get+dataUrl拼接起来的
messageQuery.setMethodName("get"+messageQuery.getDataUrl());
//从枚举类得到定义的表头
String head=tableHeadEnum.getTableHead();
//调用方法获取表格信息内容
String body=getMes(messageQuery);
//拼接表头(enum定义)和表格数据(反射获取)
head+=body;
return head;
}
/**
*MessageQuery 是我根据该条件查询值
**/
@Autowired
MessageResult message; //将所有通过反射实现的方法放到某一个统一的类中
public String getMes(MessageQuery messageQuery)throws Exception{
Class clz = messageQuery.getClass();
Method m = clz.getMethod(messageQuery.getMethodName(), messageQuery.getClass());
//执行对应的方法,获取返回值(需要把我查询条件一起传过去)
String string=(String) m.invoke(message,messageQuery);
return string;
}
3.将反射的类定义,并写里面的方法逻辑
@Component//因为要用到dao层或者service层,需要将反射的类注入到spring容器
public class SuggestionsResult {
@Autowired
DataDao runDataDao;
/**
* 获取student信息
*/
public String getstudent(MessageQuery){
//实现逻辑,返回拼好的表格body
return "";
}
/**
* 获取班级信息
*/
public String getclass(MessageQuery){
//实现逻辑,返回拼好的表格body
return "";
}
}
注:可能会出现在反射的类中无法使用 @Autowire 注入dao层,原因可能是未将自定义实现逻辑的类注入到spring中
注注:小白代码,如有疑问,欢迎大佬指正