标签:设计模式 模板方法
一,定义:模板方法模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
二,类图:
三,通过小例子讲解:
这个模式一般用在程序的步骤比较多,而且有固定的模式,固定的步骤,而每一步的实现又有多种情况,这是我们可以使用TemplateMethod模式。这样可以保证算法骨架的正确性,又将多态运用的非常好。
这里举个人一天要做的事情吧,假如一个人一天要有起床,吃饭,做事情,睡觉四个事项。
1,首先我们看模板类:
-
-
-
-
-
public abstract class PersonDay {
-
-
-
-
-
-
public final void day(){
-
doGetUp();
-
doEatBreakfast();
-
doSome();
-
doSleep();
-
}
-
-
-
public abstract void doGetUp();
-
public abstract void doEatBreakfast();
-
public abstract void doSome();
-
public abstract void doSleep();
-
}
2,我们来看学生类:
-
public class StudentDay extends PersonDay{
-
-
public void doGetUp(){
-
System.out.println("学生起床了,准备上学了")
-
}
-
-
-
-
public void doEatBreakfast(){
-
System.out.println("学生吃早餐:牛奶、面包");
-
}
-
-
-
public void doSome(){
-
System.out.println("学生上课学习");
-
}
-
-
-
public void doSleep(){
-
System.out.println("学生做完功课睡觉");
-
}
-
-
}
3,我们来看老师类:
-
public class StudentDay extends PersonDay{
-
-
public void doGetUp(){
-
System.out.println("老师起床了,安顿好家人,准备到学校工作")
-
}
-
-
-
-
public void doEatBreakfast(){
-
System.out.println("老师早餐:小米粥、油条");
-
}
-
-
-
public void doSome(){
-
System.out.println("老师上课教学");
-
}
-
-
-
public void doSleep(){
-
System.out.println("老师备完功课睡觉");
-
}
-
-
}
其它子类…………
4,看一下测试类,非常简单:
-
public class Test {
-
-
public static void main(String[] args) {
-
-
PersonDay d1 = new StudentDay();
-
d1.day();
-
-
PersonDay d2 = new WorkerDay();
-
d2.day();
-
}
-
-
}
-
</span>
分析总结:这样我们就利用模板方法完成了这个实例,我们来分析其中的特点吧:
1,将不变的核心算法行为搬移到了父类,去除了子类中的重复代码,并保证了算法的正确性,因为就在父类中写了一次。
2,具体步骤的下放,使多态体现了其中的优势,使代码的扩展性更高!
四,应用:
大家都知道在我们编写Servlet之前需要我们将之在web.xml中进行配置,这样我们才能在jsp向Servlet中传递数据,并从之获取数据,才能完成我们网页的动态显示。但是随着功能的增多,Servlet的增多,就需要我们为每个Servlet进行配置,这样有两个缺点:1,不断的进行web.xml文件配置不仅麻烦而且会使其容量越来越大,负载也会变大;2,每个servlet需要我们继承HttpServlet,这样耦合性比较高。为了解决此,我们这里可以使用模板方法进行解决。
如果根据数据库中的表进行分类的话,我们一般对表的操作可以分成增删改查,四种操作,这里我们进行上移,看模板类:
-
-
-
-
-
public abstract class CommonServlet extends HttpServlet {
-
-
@Override
-
-
protected void service(HttpServletRequest request, HttpServletResponse response)
-
throws ServletException, IOException {
-
-
-
String operationType=request.getParameter("operationType");
-
-
-
if("insert" .equals(operationType)){
-
doInsert(request,response);
-
}else if("select".equals(operationType)){
-
doSelect(request,response);
-
}else if("update".equals(operationType)){
-
doUpdate(request,response);
-
}else{
-
-
}
-
-
}
-
-
-
protected abstract void doInsert(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException;
-
protected abstract void doSelect(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException;
-
protected abstract void doUpdate(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException;
-
-
}
-
</span>
当然那些增删改查的的servlet就需要继承这个类了:
-
public class AuthServlet extends CommonServlet {
-
private IAuthService authService=new AuthServiceImpl();
-
@Override
-
protected void doInsert(HttpServletRequest request,
-
HttpServletResponse response) throws ServletException, IOException {
-
-
}
-
-
@Override
-
protected void doSelect(HttpServletRequest request,
-
HttpServletResponse response) throws ServletException, IOException {
-
-
}
-
-
@Override
-
protected void doUpdate(HttpServletRequest request,
-
HttpServletResponse response) throws ServletException, IOException {
-
-
}
-
}
-
</span>
这里注意我们在jsp页面进行相关功能时,需要我们将operationType执行的类别传过来,方便我们顶层Servlet的判断。这个就是框架抽象的很小很小的一步,但是对于这个模版方法阐释的也是很好的。
java设计模式(9):模板方法模式(TemplateMethod)
标签:设计模式 模板方法
原文地址:http://blog.csdn.net/lovesomnus/article/details/41245257