设计模式之模板方法模式
这个设计模式在开发中使用的频率也是很高的,下面来看看这个模式,先看一段没有使用设计模式的代码:
//模拟学生上课过程
public class TemlateMethod_01 {
static class GoodStudent{
public void enterClassroom(){
System.out.println("===========进入教室=========");
}
public void listen(){
System.out.println("===========认真听课,做笔记=========");
}
public void liveClassroom(){
System.out.println("===========离开教室=========");
}
}
static class BadStudent{
public void enterClassroom(){
System.out.println("===========进入教室=========");
}
public void listen(){
System.out.println("===========不想听课,睡觉吧=========");
}
public void liveClassroom(){
System.out.println("===========离开教室=========");
}
}
public static void main(String[] args) {
//模拟好学生的上课过程
GoodStudent goodStudent = new GoodStudent();
goodStudent.enterClassroom();
goodStudent.listen();
goodStudent.liveClassroom();
System.out.println("==============================");
//模拟坏学生的上课过程
BadStudent badStudent = new BadStudent();
badStudent.enterClassroom();
badStudent.listen();
badStudent.liveClassroom();
}
}
以上代码是模拟了两个学生的上课经历,观察上面的代码可以知道,上课的流程都是相同的,只是好学生和坏学生在各自听课时做法不一样而已。上面这种方式将整个上课流程都暴露,如果任意改动就会导致流程发生不合逻辑的变化。下面对其进行修改:
//模拟学生上课过程
public class TemlateMethod_02 {
static abstract class AbstractStudent{
public void study(){
this.enterClassroom();
this.listen();
this.liveClassroom();
}
public void enterClassroom(){
System.out.println("===========进入教室=========");
}
public abstract void listen();
public void liveClassroom(){
System.out.println("===========离开教室=========");
}
}
static class GoodStudent extends AbstractStudent{
@Override
public void listen(){
System.out.println("===========认真听课,做笔记=========");
}
}
static class BadStudent extends AbstractStudent{
@Override
public void listen(){
System.out.println("===========不想听课,睡觉吧=========");
}
}
public static void main(String[] args) {
//模拟好学生的上课过程
AbstractStudent goodStudent = new GoodStudent();
goodStudent.study();
System.out.println("==============================");
//模拟坏学生的上课过程
AbstractStudent badStudent = new BadStudent();
badStudent.study();
}
}
重新定义了一个抽象类,listen()方法(钩子方法)进行了抽象,由各自具体的实现类来完成逻辑,在抽象类中定义了一个study()方法,定义了整个上课的流程,实现类只需要调用该方法即可。
这种方式就是模板方法模式,study()就是模板方法,下面来看看模板方法模式的官方定义:定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义改算法的某些特定步骤。
模板方法的优点:
- 封装不变部分,扩展可变部分
- 提取公共部分的代码,便于维护
- 行为由父类控制,子类实现