【引言】
我们知道在手写Servlet方法时,会继承父类HttpServlet,这样我们创建的类就会继承HttpServlet,我们知道在HttpServlet中有几个很重要的方法,一个是doPost()方法,一个是doGet()方法,还有一个是Service()方法,当我们在调用自己写的MyServlet方法时,系统会默认调用doGet()方法,写的Servlet集成HttpServlet类,覆盖里面的doGet()、doPost()方法即可,大部分情况下,我们都是对GET和POST一样处理,一般也就这么写了:
public MyServlet extends HttpServlet{
public void doGet(HttpServletRequest request, HttpServletResponse response){
// 处理
}
public void doPost()HttpServletRequest request, HttpServletResponse response){
// 不关心get、post请求,因此post处理直接调用get处理
doGet(request, response);
}
}
Servlet只要在web.xml中部署好之后,就可以处理浏览器的请求了。上面代码可以看出来,doGet方法处理浏览器的GET请求,doPost处理POST请求。Servlet是由Tomcat之类的servlet容器来调用处理浏览器请求的,并需要集成基类HttpServlet,如果大家查看HttpServlet源码的时候,就会发现,其实里面有一个 protected void service(HttpServletRequest req, HttpServletResponse resp) 方法,servlet容器实际调用的是service方法,service方法的实现就是根据HTTP请求的类型(GET、 POST,还是其他),将处理委派给doGet、doPost等方法,由这些子类的方法来最终处理浏览器的请求。
由此可以看出,HttpServlet定义了一个处理的框架或者说模板,实现Servlet只需继承HttpServlet并实现doGet、doPost等方法即可。这个模板即为模板方法模式
【模板方法模式】
模板方法模式:在一个方法中定义一个算法的骨架,将某些步骤推迟到子类中实现。模板方法允许子类重新定义算法的某些步骤,而不改变算法的结构。
【UML图】
AbstractClass 抽象类:
package com.bjpowernode.pattern;
public abstract class AbstractClass {
public static final String METHOD_1 = "m1";
public static final String METHOD_2 = "m2";
public final void templateMethod(String methodName) {
if (METHOD_1.equals(methodName)) {
doOperation1(methodName);
}
if (METHOD_2.equals(methodName)) {
doOperation2(methodName);
}
}
protected abstract void doOperation1(String methodName);
protected abstract void doOperation2(String methodName);
}
ConcreteClass 类
package com.bjpowernode.pattern;
public class ConcreteClass extends AbstractClass {
// //覆盖该方法
// public void templateMethod(String methodName) {
// System.out.println("ConcreteClass-->>templateMethod()" + methodName);
// }
@Override
protected void doOperation1(String methodName) {
System.out.println("ConcreteClass-->>doOperation1()" + methodName);
//.........
}
@Override
protected void doOperation2(String methodName) {
System.out.println("ConcreteClass-->>doOperation2()" + methodName);
//.........
}
}
客户端测试:
package com.bjpowernode.pattern;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
AbstractClass a = new ConcreteClass();
a.templateMethod(AbstractClass.METHOD_1);
//a.templateMethod(AbstractClass.METHOD_2);
}
}
测试结果:
【优缺点】
优点:
1、在一个类中形式化地定义算法,而由它的子类实现细节的处理
2、是一种代码复用的基本技术
3、一种反向的控制结构,通过父类调用子类,通过子类的扩展增加新的行为,符合“开闭原则”
缺点:
每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统庞大抽象,但是符合“单一职责原则”,使得类的内聚性得以提高。