介绍
模板方法模式(template method)。把业务的执行顺序和步骤封装在接口的默认方法中,并暴露给客户端调用
把要变化的放到子类中实现,把固定重复的放到父类中反复调用
使用场景
- 老师上课
- 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;
}
}
优缺点
优点
- 业务的执行顺序和步骤封装起来,客户端不用管执行顺序和步骤
缺点
- 如果重写钩子方法,就违背了里氏替换原则