模板方法
概念
在面向对象程序设计过程中,程序员常常会遇到这种情况:设计一个系统时知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某些步骤的实现与具体的环境相关。
例如,去银行办理业务一般要经过以下4个流程:取号、排队、办理具体业务、对银行工作人员进行评分等,其中取号、排队和对银行工作人员进行评分的业务对每个客户是一样的,可以在父类中实现,但是办理具体业务却因人而异,它可能是存款、取款或者转账等,可以延迟到子类中实现。
模板方法(Template Method)模式的定义如下:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。它是一种类行为型模式。
模板方法结构
模板方法实例
出国留学手续一般经过以下流程:索取学校资料,提出入学申请,办理因私出国护照、出境卡和公证,申请签证,体检、订机票、准备行装,抵达目标学校等,其中有些业务对各个学校是一样的,但有些业务因学校不同而不同,所以比较适合用模板方法模式来实现。
在本实例中,我们先定义一个出国留学的抽象类StudyAbroad
,里面包含了一个模板方法TemplateMethod()
,该方法中包含了办理出国留学手续流程中的各个基本方法,其中有些方法的处理由于各国都一样,所以在抽象类中就可以实现,但有些方法的处理各国是不同的,必须在其具体子类(StudyInHarford
)中实现。如果再增加一个国家,只要增加一个子类就可以了:
package template_method;
/**
* 抽象类: 出国留学
*/
abstract class StudyAbroad {
/**
* 模板方法
*/
public void TemplateMethod() {
// 办理签证
applyForVisa();
// 入学申请
applyForEnrol();
}
public void applyForVisa() {
System.out.println("办理签证!");
}
/**
* 入学申请,具体到哪所学校
*/
public abstract void applyForEnrol();
}
package template_method;
/**
* 具体子类: 哈佛留学
*/
public class StudyInHarford extends StudyAbroad {
@Override
public void applyForEnrol() {
System.out.println("办理哈佛入学申请!");
}
}
package template_method;
/**
* 客户
*/
public class Client {
public static void main(String[] args) {
StudyAbroad studyAbroad = new StudyInHarford();
studyAbroad.TemplateMethod();
}
}