设计模式之一———模板模式(Template)

由一个简单的servlet引发的思考——设计模式的模板模式

一个普通的servlert类,我们去继承的HttpServlet类中有五个方法,init(),service(),doGet(),doPost(),destry()方法,我们自己写的servlet中要实现或者重写里面的方法,但是里面的service方法是不能重写的。当我们的参数请求到servlet类中,会到父类中的service方法中判断method是Post还是Get方式,

public final void service(){
 if(method.equals("get")){doGet()}
 else {doPost()}
}

public abstract void doGet(){}
Public abstract void doPost(){}
所以要求在HttpServlet类中有doPost和doGet方法,但是这两个方法的执行逻辑是不确定的,这时可以在HttpServlet里面定义doGet和doPost抽象类,供子类继承实现,或者定义其方法,让子类去重写。service()方法被称为模板法,去调用子类的实现方法doGet和doPost方法。

Httpservlet ser=new ActionServlet();
ser.service();

这种父类调用子类的实现的就被设计模式的模板模式

模板模式是一种最简单的设计模式,他的定义思想是,在一个操作的算法中搭一个骨架,把一些步骤延迟到子类中实现执行。

由此可以扩展的几个知识点,抽象类的作用,以及抽象类的设计与接口设计时选择接口还抽象类的问题。

由模板模式的可以很明显看出抽象类的作用和接口设计的区别,接口中的方法是全部不实现的,抽象类中可以不是抽象的方法。


适用情况:
1) 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。

  2) 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。其实这可以说是一种好的编码习惯了。

  3) 控制子类扩展。模板方法只在特定点调用操作,这样就只允许在这些点进行扩展。比如上面runBare()方法就只在runTest前面适用setUp方法。如果你不愿子类来修改你的模板方法定义的框架,你可以采用两种方式来做:一是在API中不体现出你的模板方法;二、将你的模板方法置为final就可以了。

  可以看出,使用模板方法模式可以将代码的公共行为提取出来,达到复用的目的。而且,在模板方法模式中,是由父类的模板方法来控制子类中的具体实现。这样你在实现子类的时候,根本不需要对业务流程有太多的了解。

posted on 2009-08-17 20:34  萱萱草  阅读(1753)  评论(0编辑  收藏  举报