定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。 TemplateMethod 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤
它由一个抽象类公开定义了执行它的方法的模板(执行的方式或顺序),它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。具体而言就是抽象类定义了某个方法的执行方式或者顺序,但是将该方法中的部分逻辑甚至全部逻辑实现交给具体的子类去实现,实现更高的抽象性;即父类模板方法定义不变的流程,子类重写流程中的方法
多个子类有共有的方法,并且逻辑基本相同时。
重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则又各个子类实现
AbstractClass 抽象模板中,通常包含以下两种方法:
1.基本方法
也叫基本操作,是由子类实现的方法,并且在模板方法中被调用
2.模板方法
可以有一个或者几个,实现对基本方法的调度,完成固定的逻辑;为了防止恶意操作,通常模板方法都加上 final 关键字,不允许覆写
程序的执行离不开数据的支持,数据一般从数据库中拿到;从数据库中读取数据一般分为以下几个步骤:
ReadDB
- package com.designer.template.AbstractClass;
-
- /**
- * 抽象模板(AbstractClass)
- */
- public abstract class ReadDB {
-
- protected abstract void connection();
- protected abstract void exec();
- protected abstract void readData();
- protected abstract void unConnection();
-
- public final void select(){
- connection();
- exec();
- readData();
- unConnection();
- }
- }
SqlDB
- package com.designer.template.ConcreteClass;
-
- import com.designer.template.AbstractClass.ReadDB;
-
- /**
- * 具体实现(ConcreteClass)
- */
- public class SqlDB extends ReadDB {
-
- @Override
- protected void connection() {
- System.out.println("建立与数据库的连接");
- }
-
- @Override
- protected void exec() {
- System.out.println("执行 sql 语句");
- }
-
- @Override
- protected void readData() {
- System.out.println("读取数据库中的数据");
- }
-
- @Override
- protected void unConnection() {
- System.out.println("断开与数据库的连接");
- }
- }
Test
- package com.designer.template;
-
- import com.designer.template.AbstractClass.ReadDB;
- import com.designer.template.ConcreteClass.SqlDB;
-
- public class Test {
-
- public static void main(String[] args) {
-
- ReadDB db = new SqlDB();
- db.select();
- }
- }