定义:定义一个操作中算法的骨架,而将一些步骤延迟到子类中。
模板方法使得子类可以不改变算法的结构即可重新定义该算法的某些步骤。
举个例子:
做菜可以分成三个部分: (1)配料(2)炒菜(上菜)
但是做红烧肉和西红柿炒鸡蛋步骤相同,细节不同
代码示例:
public abstract class DoDishTemplate {
//整个做菜过程
public void dodish() {
pre();
doing();
carriedDishes();
}
//配料
public abstract void pre();
//做菜
public abstract void doing();
//上菜
public abstract void carriedDishes();
}
public class Bouilli extends DoDishTemplate {
@Override
public void pre() {
System.out.println("配料:将肉切块");
}
@Override
public void doing() {
System.out.println("炒菜:将肉放在锅里红烧");
}
@Override
public void carriedDishes() {
System.out.println("上菜:将做好的红烧肉,装在碗里,端给客人");
}
}
public class EggsWithTomato extends DoDishTemplate {
@Override
public void pre() {
System.out.println("配料:打鸡蛋,洗番茄,切番茄");
}
@Override
public void doing() {
System.out.println("做菜:鸡蛋炒熟,放入番茄,加调味料");
}
@Override
public void carriedDishes() {
System.out.println("上菜:炒好的饭菜,装盘,端给客人");
}
}
public class Test {
public static void main(String[] args) {
DoDishTemplate doDishTemplate = new EggsWithTomato();
doDishTemplate.dodish();
}
}
父类做算法骨架,子类具体实现算法中的不同部分。
运行结果:
image.png
在数据库操作的一些框架的实现使用模板模式较多。之后会写一篇关于mybatis是如何使用该模式的博客。
优点:
1具体实现定义在子类中,不会改变算法整体结构。
2通过父类调用其子类的操作,子类通过对父类进行扩展,增加新的行为,符合开闭原则。
缺点:
每个实现都需要定义一个新的子类,导致类的个数增加。
网友评论