一、认识模板方法
模板方法定义:定义一个操作中的算法骨架(执行骨架),并将算法的一些步骤延迟到子类中让开发者取实现,使得子类在可以不改变该算法结构的情况下重定义该算法的某些特定步骤。
结构:
抽象类
模板方法:定义了整个执行流程的骨架,按照顺序来调用其中的基本方法。
基本方法:已经实现了的在执行流程中的方法,基本类型如下
抽象方法:在抽象类中声明,由具体子类实现。
具体方法:在抽象类中已经实现,在具体子类中可以继承或重写它。
钩子方法:在抽象类中已经实现,包括用于判断的逻辑方法和需要子类重写的空方法两种。
具体类(继承抽象类):实现抽象类中所定义的抽象方法和钩子方法。
优缺点:
优点:封装了不变部分,扩展可变部分;在父类中提取了公共的部分代码,便于代码复用;抽象类中定义了部分抽象方法来让子类实现,子类可通过扩展方式增加相应的功能,符合开闭原则。
缺点:对于每一个不同的实现都要定义一个子类,导致类的个数增大,间接增加了系统实现的复杂度;提升了代码阅读的难度;若是抽象父类添加了新的抽象方法,那么所有的子类都要改一遍,这就又不符合开闭原则。
应用场景:
在servlet中的HttpServlet抽象类中的service()方法相当于模板方法,其中包含了各种请求方法(doGet、doPost)的调用,并且请求方法可以通过继承的方式来去实现,让开发者进行自定义操作。
需要引入servlet-apijar包。
SpringMVC中的AbstractController抽象类中的handleRequest()方法也相当与模板方法。其中包含了对请求方法的判断,该类中提供了一个抽象方法handleRequestInternal()让用户进行自定义。
需要引入spring-webjar包
二、实现模板方法
demo见xyz.changlu.template包下代码:
抽象类:AbstractTemplate
//抽象模板类 public abstract class AbstractTemplate { //一整套数据库查询方法(连接数据库、执行查询操作、关闭连接操作) public void templateMethod(){ System.out.println("初始化操作"); System.out.println("连接数据库操作"); abstractMethod1(); abstractMethod2(); System.out.println("关闭连接操作"); } public abstract void abstractMethod1(); public abstract void abstractMethod2(); }
其中定义了一个模板方法,对于一些非核心业务的流程直接已经帮你实现,而核心业务方法设置为指定的抽象方法,让开发者自己去实现。
具体抽象类:ConcreteTemplate
//具体模板类:实现具体的核心业务功能 public class ConcreteTemplate extends AbstractTemplate { @Override public void abstractMethod1() { System.out.println("执行query()查询操作"); } @Override public void abstractMethod2() { System.out.println("执行update()更新操作"); } }
实现了模板方法的两个抽象方法(即核心方法)。
测试程序:测试类Customer
//测试类 public class Customer { public static void main(String[] args) { AbstractTemplate template = new ConcreteTemplate(); template.templateMethod();//执行模板方法 } }
总结
模板方法模式常常用于定义一个执行过程骨架(使用一个抽象类包含一个具体方法,该方法中是相应的执行流程,并且还有个抽象方法让开发者自定义),对于一些核心方法可以让开发者去继承该抽象类并实现方法。在框架的很多地方都使用到了该模式!!!简化了开发者许多不必要的操作,让开发者只需要专注于主要的业务开发即可!不过这样的话对于小白就不太友好了。