定义:在父类中定义处理流程的框架,在子类中实现具体的处理就成为模板方法模式(Template Method),
假设我们制定一个木偶的流程,我们想要一个做胖木偶的类,还有一个做瘦木偶的类,每个类的方法都差不多,只是具体的实现有所不同,这时我们就可以用模板方法模式,类图如下:
我们在AbstractPerson类中定义了制作玩偶的流程(在createPerson中去调用abstract方法head、body、arms、legs分别去创建玩偶的头、身体、胳膊、腿),而在子类中去做具体的实现,具体实现如下:
public abstract class AbstractPerson {
protected String head;
protected String body;
protected String arms;
protected String legs;
abstract void head();
abstract void body();
abstract void arms();
abstract void legs();
final void createPerson(){
head();
body();
arms();
legs();
System.out.println(head + "," + body + "," + arms + "," + legs + "创建成功!");
}
}
public class FatPerson extends AbstractPerson {
void head() {
head = "大圆脸";
}
void body() {
body = "大肚子";
}
void arms() {
arms = "圆胳膊";
}
void legs() {
legs = "大粗腿";
}
}
public class ThinPerson extends AbstractPerson {
void head() {
head = "瓜子脸";
}
void body() {
body = "A4腰";
}
void arms() {
arms = "细胳膊";
}
void legs() {
legs = "大长腿";
}
}
如上所示,抽象类AbstractPerson类只负责具体的流程指定,而实现类FatPerson和ThinPerson分别对流程进行了具体的实现。
下面进行测试
public class Main {
public static void main(String[] args){
AbstractPerson fatPerson = new FatPerson();
AbstractPerson thinPerson = new ThinPerson();
fatPerson.createPerson();
thinPerson.createPerson();
}
}
结果
那么用模板方法的模式有什么好处呢?
1. 可以在抽象类中定义每个处理的节点,防止遗漏,如果自己实现,不小心某个类忘记了head方法就不好了。
2. 可以让子类只关心具体方法的实现,而不用管这些方法的调用顺序。如果有些方法一定要按照严格的顺序调用,用模板方法实现也是个不错的选择。
3. 调用时引用可以用抽象类,无论父类的对象中保存哪个子类的实例,程序都可以正常运行,这种原则称为里氏替换原则。
模板方法模式属于行为型设计模式,划分了责任和算法