定义

  1. 定义一个算法的骨架,而将一些操作延迟到子类中。
  2. 模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
  3. 即需要定义多个结构大致相同,但是有小部分不同的类的情况下,可以将通用的部分放入父类中,然后由子类继承去实现不同的部分

本质

固定算法框架

代码实现

abstract class AbstractClass
{
     public abstract void Method1();    //子类需要实现

     public void TempMethod()
     {
           Method1();
     }
}


class A: AbstractClass
{
     public override void Method1()
     {
          //子类具体实现1
     }
}

class B: AbstractClass
{
     public override void Method1()
     {
          //子类具体实现2
     }
}


void Main()
{
      AbstractClass a = new A(); // 根据需要切换 new B();
      a.TempMethod(); // 最后结果,父类控制最后输出,实现部分交由子类实现
}

使用场景

  1. 计算收费金额,相同的部分是返回最终金额,不同的部分是不同的收费方式,比如打折满减
  2. 排序算法,相同的部分是返回最终结果,不同的部分是使用不同的方式进行排序,比如冒泡排序,选择排序,插入排序

何时使用

  1. 需要固定一个算法,实现不变的部分,可变的部分交由子类实现
  2. 子类具有公共行为,应该抽离出来,放到公共类中实现,避免代码重复
  3. 需要控制子类的输出,只允许子类的不同实现,最终输出交由父类

优点与缺点

代码复用

  • 骨架不容易升级
  • 父类添加了抽象方法,子类都需要实现一遍

对设计模式的体现

  • 开闭原则,分离变与不变的部分,将不变的实现,然后封闭起来,尽量不修改它,当需要新的扩展时,变化的部分给子类去实现
  • 李氏替换原则,子类可拥有父类的功能,并实现父类的功能,所有的子类实现了同一套算法模版,根据需要,切换不同的具体实现