模板方法模式

模板方法模式

介绍

模板方法模式(template method)。把业务的执行顺序和步骤封装在接口的默认方法中,并暴露给客户端调用
把要变化的放到子类中实现,把固定重复的放到父类中反复调用

使用场景

  1. 老师上课
  2. dbutils多行处理器

案例

接口

/**
 * 老师接口
 */
public interface Teacher {
    /**
     * 点名
     */
    void callTheRoll();

    /**
     * 讲课
     */
    void prelection();

    /**
     * 作业
     */
    void assignment();

    /**
     * 这就是模版方法,将业务执行的步骤顺序封装在这个方法中
     * 并暴露给客户端调用
     */
    default void attendClass() {
        callTheRoll();
        prelection();
        //判断钩子是否剔除了此方法
        if (hook()){
            assignment();
        }
    }

    /**
     * 钩子方法,子类负责重写这个方法来剔除不需要的步骤,
     * 默认值为true表示不剔除
     * @return
     */
    default Boolean hook(){
        return true;
    }
}

实现类

/**
 * 英语老师
 */
public class EnglishTeacher implements Teacher{
    @Override
    public void callTheRoll() {
        System.out.println("英语老师点名");
    }

    @Override
    public void prelection() {
        System.out.println("英语老师讲课");
    }

    @Override
    public void assignment() {
        System.out.println("英语老师布置作业");
    }
}
/**
 * 体育老师
 */
public class SportsTeacher implements Teacher{
    @Override
    public void callTheRoll() {
        System.out.println("体育老师点名");
    }

    @Override
    public void prelection() {
        System.out.println("体育老师讲课");
    }

    @Override
    public void assignment() {}

    @Override
    public Boolean hook(){
        return false;
    }
}

优缺点

优点

  1. 业务的执行顺序和步骤封装起来,客户端不用管执行顺序和步骤

缺点

  1. 如果重写钩子方法,就违背了里氏替换原则