缘起:07年8月进公司发现公司的控制页面跳转和功能执行方式如下,
jsp页面存放两个隐藏参数:
1)view:决定处理类型;
2)action:决定处理方式:
3)服务器端controller代码结构:
[code="java"]
if(view.equals("insert")){
if("insertProjectMes".equals(action)){
}
if("insertPictures".equals(action)){
}
...
}
else if(view.equals("update")){
...
}
else if(view.equals("select")){
...
}
else if(view.equals("delete")){
...
}
[/code]
每个controller十几个if,else也是家常便饭,多的时候几十个,而且业务经常新增,看到03年一直被修改过来的代码也是经常的事。
辞职在家进修学习,又想这个问题:请问怎么去除这些if else呢?
个人想法(spring):
1)在spring上下文中配置一个jsp,和controller,和一个action参数
2)在jsp中放置参数,值在第一次访问jsp的时候被spring注入;
3)controller中
a)定义四个接口,对应操作类型:有参数无返回,无参数无返回,有参数有返回,有参数无返回;
public interface Do1 {
Object doing();//无参数有返回
}
public interface Do2 {
void doing();//无返回无参数
}
public interface Do3 {
void doing(Object o);//无返回有参数
}
public interface Do4 {
Object doing(Object o);//有返回有参数
}
b)业务处理类,以action的值命名,实现上面某个接口,controller的内部类实现并存入map对象
c)controller通过map对象管理处理类,并在客户提交的时候根据传过来的action参数反射调用相应的业务处理类。
似乎就是一个状态模式。好处就是每个人需要添加的时候只要在后面添加新的内部类,并把自己加入map就行。
请问怎么去除这些if else呢? 谢谢
像这种代码可以说可维护性太差
一定要用多态,这也太多if else了
可以搞个命令模式,把view,和action封装成一个对象
class Command{
String view;
String action;
...
}
服务器端controller增加方法可为:
processRequest(Command c)
用这个方法处理
[code="java"]
if(view.equals("insert")){
if("insertProjectMes".equals(action)){
}
if("insertPictures".equals(action)){
}
...
}
else if(view.equals("update")){
...
}
else if(view.equals("select")){
...
}
else if(view.equals("delete")){
...
}
[/code]
对了,每一个view,action值对都应该有对应的一个类,
比如:
InsertProjectMesAction,InsertPicturesAction,后面的同理
它们实现一个接口Action
public interface Action
{
processAction( 要用到的参数);
}
Map map = ....
controller通过Map map对象管理Action类,并在客户提交的时候根据传过来的每一对view,action参数构建一个Command,然后调用相应的业务处理类。
可以试试,spring java的反映机制
使用State 模式。
这种情况改成观察者模式。
我觉的你把问题搞复杂了,如果每个action对应一个方法的话,那么在controller里直接根据这个参数用反射拿到Method然后再调用invoke方法就行,一个if else也不需要,做法类似于struts的dispatchAction(大概是这个类名,很久没用记不清了).