我有以下伪代码说明的以下问题(可能没有多大意义):
class Form {
boolean loggedOn = false;
String id = null;
...get/set shared methods
}
class SearchFormA extends Form{
String name = null;
String email = null;
...get/set methods
}
class SearchFormB extends Form{
String age = null;
String gender = null;
...get/set methods
}
class Search {
public Search(HttpServletRequest request){
String searchMode = (String) request.getSearchMode();
if("0".equals(searchMode)){
SearchFormA formA = new SearchFormA();
formA.setName((String)request.getParameter("name"));
formA.setId((String)request.getParameter("id"));
...populate form
request.getSession().setAttribute("formA",formA);
}
if("1".equals(searchMode)){
SearchFormB formB = new SearchFormB();
formB.setAge((String)request.getParameter("age"));
formB.setId((String)request.getParameter("id"));
...populate form
request.getSession().setAttribute("formB",formB);
}
...rest of code
}
}
我所做的是使用反射,但是在编译时还有其他方法吗? 我也尝试过Factory方法,但是SearchFormA和SearchFormB这两个类没有多少共同之处。
编辑:好的,基本上,在这种情况下,我有4-5个searchModes,每个searchMode都有不同的形式。在这些形式之间,它们共享某些类似的领将来我可能需要添加10个searchModes,它会重复填充相同的字段。答案 0 :(得分:2)
不幸的是,你的代码太过“伪”。例如,您不清楚从哪里开始searchMode
。此外,您的特定表单的初始化也是硬编码的。我相信在现实生活中,所有这些数据都来自班级Data
。
所以,我假设类Data
包含name,age,id。现在的问题是Data类如何包含这些数据。特殊领域?通用哈希表?
在任何情况下,我认为你有某种“通用”代码(搜索类)并且必须创建特殊形式这一事实是一种糟糕的模式。您应该使用一些自动填充特定表单的MVC框架。然后使用表单数据运行搜索逻辑。如果你有两种模式的共享逻辑,则在抽象类或实用程序类中实现它。
答案 1 :(得分:1)
我认为你目前的方法没有太大问题。您可以使用枚举来避免字符串比较,如下例所示:
public enum SearchMode {
A {
@Override
public Form createForm(Data data) {
SearchFormA form = new SearchFormA();
form.setName(...);
populateCommon(form, data);
return form;
}
},
B {
@Override
public Form createForm(Data data) {
SearchFormB form = new SearchFormB();
form.setAge(...);
populateCommon(form, data);
return form;
}
};
public abstract Form createForm(Data data);
public void populateCommon(Form form, Data data) {
// Set common properties
form.setId(...);
}
public static Form createForm(String searchMode, Data data) {
return SearchMode.valueOf(searchMode).createForm(data);
}
}
答案 2 :(得分:0)
您显然要避免的是,在搜索方法中,您必须继续追加if结构(意大利面条代码)。
我觉得你所描述的情况与我为this answer所写的情况没有什么不同。这意味着战略和模板(以及其他)可以派上用场。
干杯, 维姆