模板方法可以用来干嘛?

问题: 有3个方法:A、B、C三个方法,我想先执行A ,在执行B ,最后执行C,并且想在子类中重构B方法,所以问题就来了,我既想保证3个方法的执行顺序,又想在不同子类中重写B方法,有什么解决方法呢?
这就是模板方法,定义:

public abstract class ABC{
    /**
     * 模板方法
     */
    public void main(){
        //调用基本方法
        A();
        B();
        C();
    }

 /**
     * 基本方法(空方法)
     */
    protected void A(){}
    

    /**
     * 基本方法的声明(由子类实现)
     */
    protected abstract void B();
    
   
    /**
     * 基本方法(已经实现)
     */
    private final void C(){
        //业务相关的代码
    }
}

在上述类ABC中:

  • main方法是一个public的 方法,只有这个方法可以被外部调用,并且内部有调用各个方法,这些方法是有顺序性
  • A方法、B方法都可以被子类重写,当然也可以在父类中填写A方法,作为一个默认的方法,
  • C方法是一个固定的写完的方法,不能再子类中重写

这样一个方法定义好了

优点与缺点

优点:

  • 使用模版方法模式,在定义算法骨架的同时,可以很灵活的实现具体的算法,满足用户灵活多变的需求,封装不变部分,扩展可变部分;例如你装饰房子的方法有很多种,每一种都可能给你带来不一样的体验;
  • 提取公共代码,有利于后期的维护;例如每个房间功能明确;
  • 行为由父类控制,子类实现;比如定义了厨房这个房间,具体厨房要怎么装修,要看你的做法;

缺点:

  • 如果算法流程有修改的话,则需要修改抽象类;影响所有子类。
  • 每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。其实我觉得这个都不算是缺点,因为模板方法相对于其他方法来说,类的个数都没有那么多。

参考博客

模板方法模式(Template Method) - 最易懂的设计模式解析[Java设计模式]3.模板模式