模板模式就是在父类中定义了一个模板框架,将方法执行的步骤延迟到子类中去实现,子类可以在不改变框架的前提下,自定义某些特定的执行步骤。
模板方法模式的类图如下:
AbstactClass是一个抽象模板,它由模板方法和基本方法组成
- 基本方法:是抽象方法,由子类实现,并在模板方法中被调用
- 模板方法: 可以有一个或几个,一般是具体的方法,实现对基本方法的调度,完成确定的业务逻辑。确定一个框架。
ConcreteClass1和ConcreteClass2属于具体模板类,实现抽象模板所定义的抽象方法
模板方法模式的小Demo:
package template;
public class TemplateTest {
public static void main(String[] args) {
Teacher teacher = new Teacher();
teacher.start();
Student student = new Student();
student.start();
}
}
// 抽象父类
abstract class Human {
// 定义抽象方法
abstract void eat();
abstract void sleep();
// 定义具体的模板方法
public void start(){
// 定义一个框架来确定方法的执行步骤
eat();
sleep();
}
}
class Teacher extends Human{
@Override
void eat() {
System.out.println("我是一名老师,正在吃晚饭");
}
@Override
void sleep() {
System.out.println("我是一名老师,准备睡觉");
}
}
class Student extends Human{
@Override
void eat() {
System.out.println("我是一名学生,正在吃晚饭");
}
@Override
void sleep() {
study();
System.out.println("我是一名学生,正准备睡觉");
}
// 其他业务逻辑
private void study(){
System.out.println("我是一名学生, 晚饭过后在学习");
}
}
通过如下结果可知,我们在不改变eat和sleep方法的执行顺序的前提下,Student类通过在实现sleep的方法中加入了其他的业务逻辑,改变了sleep这个特定的执行步骤
模板方法模式的优点:
- 封装不变的部分,扩展可变的部分
- 提取公共的部分代码,便于维护
- 行为由父类控制,子类实现。