一,定义:模板方法模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

二,类图:

三,通过小例子讲解:

这个模式一般用在程序的步骤比较多,而且有固定的模式,固定的步骤,而每一步的实现又有多种情况,这是我们可以使用TemplateMethod模式。这样可以保证算法骨架的正确性,又将多态运用的非常好。

这里举个人一天要做的事情吧,假如一个人一天要有起床,吃饭,做事情,睡觉四个事项。

1,首先我们看模板类:

  1. /**
  2. * 模板方法设计模式中的“模板类”
  3. * 一般情况下模板类都是一个抽象类
  4. */
  5. public abstract class PersonDay {
  6. /**
  7. * 在模板方法中编写核心算法,这个算法是不会改变的,这个算法被子类继承,可以得到复用。
  8. * 模板方法的流程一般不让子类覆盖,不希望子类去重新定义核心算法,所以模板方法通常被final修饰
  9. */
  10. public final void day(){
  11. doGetUp();
  12. doEatBreakfast();
  13. doSome();
  14. doSleep();
  15. }
  16. //将行为的具体实现延迟到子类中完成,达到不同的实现效果。
  17. public abstract void doGetUp();
  18. public abstract void doEatBreakfast();
  19. public abstract void doSome();
  20. public abstract void doSleep();
  21. }

2,我们来看学生类:

  1. public class StudentDay extends PersonDay{
  2. //学生起床
  3. public  void doGetUp(){
  4. System.out.println("学生起床了,准备上学了")
  5. }
  6. //吃早餐
  7. public void doEatBreakfast(){
  8. System.out.println("学生吃早餐:牛奶、面包");
  9. }
  10. //上学
  11. public void doSome(){
  12. System.out.println("学生上课学习");
  13. }
  14. //睡觉
  15. public void doSleep(){
  16. System.out.println("学生做完功课睡觉");
  17. }
  18. }

3,我们来看老师类:

  1. public class StudentDay extends PersonDay{
  2. //老师起床
  3. public  void doGetUp(){
  4. System.out.println("老师起床了,安顿好家人,准备到学校工作")
  5. }
  6. //吃早餐
  7. public void doEatBreakfast(){
  8. System.out.println("老师早餐:小米粥、油条");
  9. }
  10. //教学
  11. public void doSome(){
  12. System.out.println("老师上课教学");
  13. }
  14. //睡觉
  15. public void doSleep(){
  16. System.out.println("老师备完功课睡觉");
  17. }
  18. }

其它子类…………

4,看一下测试类,非常简单:

  1. public class Test {
  2. public static void main(String[] args) {
  3. //父类指向子类
  4. PersonDay d1 = new StudentDay();
  5. d1.day();
  6. PersonDay d2 = new WorkerDay();
  7. d2.day();
  8. }
  9. }
  10. </span>

分析总结:这样我们就利用模板方法完成了这个实例,我们来分析其中的特点吧:

1,将不变的核心算法行为搬移到了父类,去除了子类中的重复代码,并保证了算法的正确性,因为就在父类中写了一次。

2,具体步骤的下放,使多态体现了其中的优势,使代码的扩展性更高!

四,应用:

大家都知道在我们编写Servlet之前需要我们将之在web.xml中进行配置,这样我们才能在jsp向Servlet中传递数据,并从之获取数据,才能完成我们网页的动态显示。但是随着功能的增多,Servlet的增多,就需要我们为每个Servlet进行配置,这样有两个缺点:1,不断的进行web.xml文件配置不仅麻烦而且会使其容量越来越大,负载也会变大;2,每个servlet需要我们继承HttpServlet,这样耦合性比较高。为了解决此,我们这里可以使用模板方法进行解决。

如果根据数据库中的表进行分类的话,我们一般对表的操作可以分成增删改查,四种操作,这里我们进行上移,看模板类:

  1. /**
  2. * 模板类,以后编写的servlet类需要继承这个类,而不是httpservlet类了
  3. * @author Administrator
  4. */
  5. public abstract class CommonServlet extends HttpServlet {
  6. @Override
  7. //模板方法,定义了算法
  8. protected void service(HttpServletRequest request, HttpServletResponse response)
  9. throws ServletException, IOException {
  10. //获取执行的类型
  11. String operationType=request.getParameter("operationType");
  12. //判断
  13. if("insert" .equals(operationType)){
  14. doInsert(request,response);
  15. }else if("select".equals(operationType)){
  16. doSelect(request,response);
  17. }else if("update".equals(operationType)){
  18. doUpdate(request,response);
  19. }else{
  20. //.......................
  21. }
  22. }
  23. //抽象方法,都需要实现
  24. protected abstract void doInsert(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException;
  25. protected abstract void doSelect(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException;
  26. protected abstract void doUpdate(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException;
  27. }
  28. </span>

当然那些增删改查的的servlet就需要继承这个类了:

  1. public class AuthServlet extends CommonServlet {
  2. private IAuthService authService=new AuthServiceImpl();
  3. @Override
  4. protected void doInsert(HttpServletRequest request,
  5. HttpServletResponse response) throws ServletException, IOException {
  6. //根据不同的表插入方法的具体实现
  7. }
  8. @Override
  9. protected void doSelect(HttpServletRequest request,
  10. HttpServletResponse response) throws ServletException, IOException {
  11. //根据不同表查询方法的具体实现
  12. }
  13. @Override
  14. protected void doUpdate(HttpServletRequest request,
  15. HttpServletResponse response) throws ServletException, IOException {
  16. //根据表的不同,更新方法的具体实现。
  17. }
  18. }
  19. </span>

这里注意我们在jsp页面进行相关功能时,需要我们将operationType执行的类别传过来,方便我们顶层Servlet的判断。这个就是框架抽象的很小很小的一步,但是对于这个模版方法阐释的也是很好的。

最新文章

  1. nodejs授权连接mongodb
  2. 网页引用google字体速度慢:fonts.googleapis.com
  3. vs2010 C#链接 ACCESS数据库
  4. 用Js的eval解析JSON中的注意点
  5. 用 VIPER 构建 iOS 应用架构(2)
  6. 递归神经网络(Recurrent Neural Networks,RNN)
  7. Part 6 Group by in sql server
  8. linux 5.5 开xmanager远程
  9. (00)Java编程思想开篇立言。
  10. JAVA中方法的定义与使用(课堂学习归纳)
  11. 最小生成树 TOJ 4117 Happy tree friends
  12. ARM Linux内核Input输入子系统浅解
  13. java.io.IOException: Server returned HTTP response code: 411 for URL
  14. css背景图撑开盒子高度
  15. common lisp 里的几个操作符(2)
  16. api测试工具
  17. Sitecore xDB基础知识 - 识别用户,联系人,访客,客户
  18. 在Linux中简单实现回收子进程
  19. [HTML] css3 输入框input类型为number时,去掉上下箭头方式
  20. 添加默认的过滤条件xml

热门文章

  1. STM32进阶日志1
  2. Failed to start component [StandardEngine[Tomcat].StandardHost[localhost].StandardContext[]] 错误(Day_25)
  3. opencv——PCA(主要成分分析)数学原理推导
  4. 5分钟安装docker教程
  5. Navicat注册机报错No all pattern found! file already patched
  6. 利用NVIDIA-NGC中的MATLAB容器加速语义分割
  7. 微调BERT:序列级和令牌级应用程序
  8. 【NX二次开发】Block UI 指定平面
  9. 【NX二次开发】按层查找工作部件中的对象 UF_LAYER_cycle_by_layer
  10. 【NX二次开发】根据视图名称获取视图的矩阵