xo_tobacoo
xo_tobacoo
2009-04-17 14:41

一年半之前的疑问,再问一遍,基础的

已采纳

缘起: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呢? 谢谢

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

5条回答

  • wanghaolovezlq wanghaolovezlq 12年前

    像这种代码可以说可维护性太差
    一定要用多态,这也太多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,然后调用相应的业务处理类。

    点赞 评论 复制链接分享
  • zhang26chao zhang26chao 12年前

    我觉的你把问题搞复杂了,如果每个action对应一个方法的话,那么在controller里直接根据这个参数用反射拿到Method然后再调用invoke方法就行,一个if else也不需要,做法类似于struts的dispatchAction(大概是这个类名,很久没用记不清了).

    点赞 评论 复制链接分享
  • weixin_42513366 Candyut 12年前

    这种情况改成观察者模式。

    点赞 评论 复制链接分享
  • hantsy hantsy 12年前

    使用State 模式。

    点赞 评论 复制链接分享
  • weixin_42297497 weixin_42297497 12年前

    可以试试,spring java的反映机制

    点赞 评论 复制链接分享

相关推荐