定义一个算法骨架(模板),将算法中的某一些步骤对子类凋谢批改,以此来区别子类。

比如说在部队中可能在一起的有炮兵、汽车兵、步兵等,他们每天都要训练,训练内容射击、跑步是每个兵种每天都要练的,然而还有其它训练是每个兵种本人独有的训练,那么他们一条的训练内容可能如下。

08:00 跑步10:00 专业训练A14:00 专业训练B16:00 射击训练

以上就是部队对立制订的训练框架,那么炮兵的训练可能是

08:00 跑步10:00 装弹训练A14:00 防空训练B16:00 射击训练

模板办法模式可能有以下角色

  • 抽象类:定义对立的办法内容,定义形象办法用于子类非凡实现,将这些办法组合成一个算法模板(同时外面可能会有一些钩子办法,这些钩子办法实现为空,意思是能够让子类重写进行实现,不重写也能够,这个步骤的有无依据本人须要)。
  • 具体实现类:继承实现抽象类及形象办法

上面应用一个炒菜的例子来实现模板办法模式

抽象类 - Cook

public abstract class Cook {    final void template(){        putOil();        putMeat();        putVegetable();        putSalt();        putAginomoto();        plateLoading();    }    final void putOil(){        System.out.println("放油");    }    abstract void putMeat();    abstract void putVegetable();    final void putSalt(){        System.out.println("放盐");    };    //放味精 - 依据本人爱好    void putAginomoto(){    }    final void plateLoading(){        System.out.println("装盘");    }}

具体实现 - 炒韭菜、炒芹菜

public class CookLeek extends Cook{    @Override    void putMeat() {        System.out.println("放入牛肉");    }    @Override    void putVegetable() {        System.out.println("放入韭菜");    }}
public class CookCelery extends Cook{    @Override    void putMeat() {        System.out.println("放入猪肉");    }    @Override    void putVegetable() {        System.out.println("放入芹菜");    }    @Override    void putAginomoto() {        System.out.println("放入味精");    }}

测试

public class TemplateTest {    @Test    public void test(){        Cook cook1 = new CookCelery();        cook1.template();        System.out.println("===================");        Cook cook2 = new CookLeek();        cook2.template();    }}======测试======放油放入猪肉放入芹菜放盐放入味精装盘===================放油放入牛肉放入韭菜放盐装盘