(三)简单工厂模式详解 (二)

2014-11-24 10:41:11 · 作者: · 浏览: 4
req, HttpServletResponse resp) throws ServletException, IOException {
//我们加入一个操作的参数,来让servlet做出不同的业务处理
String operation = req.getParameter("operation");
if (operation.equals("login")) {
System.out.println("login");
}else if (operation.equals("register")) {
System.out.println("register");
}else if (operation.equals("loginout")) {
System.out.println("loginout");
}else {
throw new RuntimeException("invalid operation");
}
} 这实在是非常烂的代码,因为每次你新加一个操作,都要修改doPost这个方法,而且多个业务逻辑都集中在这一个方法当中,会让代码很难维护与扩展,最容易想到的就是下列做法。(小提示:如果你的项目中出现了这种代码结构,请务必想办法去掉它,你完全可以尽量忘掉Java里还有elseif和swich)


[java]
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//我们加入一个操作的参数,来让servlet做出不同的业务处理
String operation = req.getParameter("operation");
if (operation.equals("login")) {
login();
}else if (operation.equals("register")) {
register();
}else if (operation.equals("loginout")) {
loginout();
}else {
throw new RuntimeException("invalid operation");
}
}

public void login(){
System.out.println("login");
}

public void register(){
System.out.println("register");
}

public void loginout(){
System.out.println("loginout");
}

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//我们加入一个操作的参数,来让servlet做出不同的业务处理
String operation = req.getParameter("operation");
if (operation.equals("login")) {
login();
}else if (operation.equals("register")) {
register();
}else if (operation.equals("loginout")) {
loginout();
}else {
throw new RuntimeException("invalid operation");
}
}

public void login(){
System.out.println("login");
}

public void register(){
System.out.println("register");
}

public void loginout(){
System.out.println("loginout");
}
这样会比第一种方式好一点,一个方法太长,实在不是什么好征兆,等到你需要修改这部分业务逻辑的时候,你就会后悔你当初的写法了,如果这段代码不是亲手写的,那请你放心的在心中吐糟吧,因为这实在不是一个合格的程序员应该写出的程序。

虽然我们已经将各个单一的业务逻辑拆分成方法,但这依然是违背单一原则的,因为我们的servlet应该只是处理业务逻辑,而不应该还要负责与业务逻辑不相关的处理方法定位这样的责任,这个责任应该交给请求方,原本在三个servlet分别处理登陆,注销和注册的时候,其实就是这样的,作为请求方,我请求LoginServlet,就说明我要登陆,处理的servlet不需要再去多考虑请求方到底是要登陆还是注销。

所以我们需要想办法把判断的业务逻辑交给请求方去处理,回想下struts2的做法,我们可以简单模拟下struts2的做法。相信不少同学应该都用过struts2,那么你肯定对以下配置很熟悉。


[html]

struts2
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter



struts2
/*


struts2
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter


struts2
/*
这是struts2最核心的filter,它的任务就是分派各个请求,根据请求的URL地址,去找到对应的处理该请求的Action,我们来模拟下,首先我们先一步一步来,我们先消除servlet在web.xml的配置,我们写出如下filter。


[java]
package com.web.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

import com.web.factory