一、基本介绍
模板方法(行为型):定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。
二、包含角色
1.抽象类:负责给出一个算法的轮廓和骨架。它由一个模板方法和若干个基本方法构成。
2.具体子类:实现抽象类中所定义的抽象方法和钩子方法。
三、案例及UML类图
案例说明:
泡茶的大体步骤基本差不多,但是每种茶细节上怎么泡和辅料添加什么又略有不同, 所以个体的不同留给个体自己去实现。
UML类图:
类MakeTea:
public abstract class MakeTea {
/**
* 泡茶方法,即给客户端调用的接口方法,它定义了整个流程步骤
*/
public void makeTea() {
//1.洗茶叶
cleanTea();
//2.泡茶
make();
//3.添加辅料
addAccessories();
//4.喝茶
eat();
//5.清洗杯具
cleanCup();
}
protected void cleanTea() {
System.out.println("清洗茶叶");
}
/**
* 泡茶,每种茶泡的方式都不太一样,留给子类具体实现
*/
protected abstract void make();
/**
* 添加辅料。每种茶添加的辅料都不一样,留给子类具体实现
*/
protected abstract void addAccessories();
protected void eat() {
System.out.println("喝茶");
}
protected void cleanCup() {
System.out.println("杯具清洗");
}
}
说明:泡茶抽象类,抽象类角色,定义了泡茶的整个流程基本骨架和留给子类实现的抽象方法。
类OolongTeaMake:
public class OolongTeaMake extends MakeTea {
/**
* 泡乌龙茶
*/
@Override
protected void make() {
System.out.println("泡乌龙茶中,具体步骤如下....");
}
@Override
protected void addAccessories() {
System.out.println("什么辅料都不加");
}
}
说明:乌龙茶类,具体子类,重写父类中未实现且具有差异的方法。
类RoseAndHoneyTeaMake:
public class RoseAndHoneyTeaMake extends MakeTea {
@Override
protected void make() {
System.out.println("先添加红茶");
System.out.println("再添加玫瑰");
System.out.println("泡");
}
@Override
protected void addAccessories() {
System.out.println("添加蜂蜜");
}
}
说明:玫瑰蜂蜜茶,具体子类,重写父类中未实现且具有差异的方法。
类TemplateMethodTest:
public class TemplateMethodTest {
public static void main(String[] args) {
//乌龙茶
MakeTea makeTea = new OolongTeaMake();
makeTea.makeTea();
//玫瑰蜂蜜茶
makeTea = new RoseAndHoneyTeaMake();
makeTea.makeTea();
}
}
说明:测试及客户端类。
四、适用场景
1.算法的整体步骤很固定,但其中个别部分易变时,这时候可以使用模板方法模式,将容易变的部分抽象出来,供子类实现。
2.当多个子类存在公共的行为时,可以将其提取出来并集中到一个公共父类中以避免代码重复。
3.一般用在架构设计或者代码设计中,符合依赖倒转原则。