设计模式-模板方法模式

    我们知道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();
    }
}
以上为个人对模板方法模式的总结。

你可能感兴趣的:(设计模式-模板方法模式)