【DRP】——Servlet与模板方法模式的应用

 【引言】 

   我们知道在手写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、一种反向的控制结构,通过父类调用子类,通过子类的扩展增加新的行为,符合“开闭原则”

缺点:

  每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统庞大抽象,但是符合“单一职责原则”,使得类的内聚性得以提高。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 19
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值