我们知道Java里共有23种设计模式,模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤,模板方法模式属于行为型设计模式。
模板方法模式
定义
模板方法模式通常又叫模板模式,是指定义一个算法的骨架,并允许子类为其中的一个或多个步骤提供实现。
适用场景
(1) 一次性实现一个算法不变的部分,并将可变的行为留给子类实现。
(2) 各子类中公共的行为被提取出来并集中到一个公共的父类中,从而避免代码重复。
优点
(1) 利用模板方法将相同处理逻辑的代码放到抽象的父类中,提高代码复用性。
(2) 将不同的代码放到不同的子类中,通过对子类的扩展增加新的行为,提高代码扩展性。
(3) 将不变的行为写到父类中,去除子类的重复代码,符合开闭原则。
缺点
(1) 类数目的增加,每个抽象类都需要一个子类来实现。
(2) 类数量的增加,间接的增加了系统实现的复杂度。
(3) 继承关系自身的缺点,如果父类中添加新的抽象方法,所有子类都要修改。
实例
/**
* 抽象父类
*/
public abstract class AbstractCourse {
//模板方法
public final void createCourse() {
//1.预习资料
prepareData();
//2.制作课件
createCourseWare();
//3.直播授课
liveLectures();
//4.上传笔记
uploadNotes();
//5.课后作业
doHomeWork();
//钩子方法
if (needCheck()) {
//6.检查作业
needCheckHomeWork();
}
}
protected void prepareData() {
System.out.println("预习资料");
}
protected void createCourseWare() {
System.out.println("制作课件");
}
protected void liveLectures() {
System.out.println("直播授课");
}
protected void uploadNotes() {
System.out.println("上传笔记");
}
protected void doHomeWork() {
System.out.println("课后作业");
}
/**
* 钩子方法 用来干预执行流程
*/
protected boolean needCheck() {
return false;
}
/**
* 检查作业方式不同 子类实现
*/
protected abstract void needCheckHomeWork();
}
/**
* JavaCourse类
*/
public class JavaCourse extends AbstractCourse{
private boolean needCheck = false;
public JavaCourse(boolean needCheck) {
this.needCheck = needCheck;
}
@Override
protected boolean needCheck() {
return this.needCheck;
}
@Override
protected void needCheckHomeWork() {
System.out.println("检查Java作业");
}
}
/**
* PythonCourse类
*/
public class PythonCourse extends AbstractCourse {
@Override
protected void needCheckHomeWork() {
System.out.println("检查Python作业");
}
}
/**
* 测试类
*/
public class Test {
public static void main(String[] args) {
JavaCourse javaCourse = new JavaCourse(true);
javaCourse.createCourse();
System.out.println("================================");
PythonCourse pythonCourse = new PythonCourse();
pythonCourse.createCourse();
}
}