模板模式,虽然说的高端,其实都见过,在读jdk源码时,常常发现有一些抽象类,定义了一些方法,由不同的子类去实现了,这就是模板模式。。。
通俗一点就是这么说,在一个操作中,可能存在相同的操作步骤1,操作步骤2,操作步骤3,但是操作步骤4又存在着一些细微的差别,就需要由不同的子类来定义各自的实现,但是需要基于规定好的算法框架下。
举例子的话,其实对于考试,就是如此,发试卷,收试卷,就是相同的操作,但是做试卷确是不同的,每个人的答案不一样啊。
1.抽象类,定义共性方法,定义个性方法接口原则
/**
* @author: wayne
* @desc:
* @date: 2017/12/27 16:36
* @version: 1.0
*/
public abstract class Exam {
/**
* 分发试卷
*/
public final void distributePage(){
System.out.println("发试卷");
}
/**
* 收回试卷
*/
public final void takeBackPage(){
System.out.println("收试卷");
}
/**
* 做题
*/
public abstract void doExercise();
/**
* 考试中
*/
public final void inExaming(){
distributePage();
doExercise();
takeBackPage();
}
}
2.考试是针对学生时,产生学生实体
/**
* @author: wayne
* @desc:
* @date: 2017/12/27 16:41
* @version: 1.0
*/
public class Student extends Exam{
private int num;
private String name;
public Student(int num, String name) {
this.num = num;
this.name = name;
}
@Override
public void doExercise() {
System.out.println("学号:"+num+"--"+"姓名:"+name+" 做题结束");
}
}
3.测试
/**
* @author: wayne
* @desc:
* @date: 2017/12/27 16:43
* @version: 1.0
*/
public class TestTempleteDesign {
public static void main(String[] args) {
Exam exam1 = new Student(1,"张三");
Exam exam2 = new Student(2,"李四");
Exam exam3 = new Student(3,"王五");
exam1.inExaming();
exam2.inExaming();
exam3.inExaming();
}
}
发试卷
学号:1--姓名:张三 做题结束
收试卷
发试卷
学号:2--姓名:李四 做题结束
收试卷
发试卷
学号:3--姓名:王五 做题结束
收试卷
上述是针对学生的考试,那么如果将来产生针对老师的考试,只要新建Teacher实体类,调用考试方法,原有不需要修改,符合“开闭”原则。