定义一个算法骨架 (模板),将算法中的某一些步骤对子类凋谢批改,以此来区别子类。
比如说在部队中可能在一起的有炮兵、汽车兵、步兵等,他们每天都要训练,训练内容射击、跑步是每个兵种每天都要练的,然而还有其它训练是每个兵种本人独有的训练,那么他们一条的训练内容可能如下。
08:00 跑步
10:00 专业训练 A
14:00 专业训练 B
16:00 射击训练
以上就是部队对立制订的训练框架,那么炮兵的训练可能是
08:00 跑步
10:00 装弹训练 A
14:00 防空训练 B
16: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();}
}
====== 测试 ======
放油
放入猪肉
放入芹菜
放盐
放入味精
装盘
===================
放油
放入牛肉
放入韭菜
放盐
装盘