AbstarctClass中的template方法定义了operation方法执行的逻辑,但operation方法没有具体实现,子类通过继承该类,实现这些细节方法,再通过父类模板向外提供调用
在模板方法中,存在这样一个方法,这个方法不是抽象的,但是没有实现体,定义为一个默认的行为,子类可以视情况要不要覆盖它,这个方法称为钩子
/***
* @author shaofan
* @Description 模板方法解决豆浆制作问题
*/
public class Template {
public static void main(String[] args) {
SoybeanMilk milk = new BlackBeanMilk();
milk.make();
SoybeanMilk milk1 = new RedBeanMilk();
milk1.make();
SoybeanMilk milk2 = new OnlySoyBeanMilk();
milk2.make();
}
}
/***
* 父类模板
*/
abstract class SoybeanMilk{
void make(){
select();
if(needAdd()){
add();
}
soak();
beat();
}
abstract void select();
abstract void add();
abstract void soak();
abstract void beat();
boolean needAdd(){
return true;
}
}
class BlackBeanMilk extends SoybeanMilk{
@Override
void select() {
System.out.println("选择黑豆");
}
@Override
void add() {
System.out.println("添加黑豆");
}
@Override
void soak() {
System.out.println("浸泡黑豆");
}
@Override
void beat() {
System.out.println("打碎黑豆");
}
}
class RedBeanMilk extends SoybeanMilk{
@Override
void select() {
System.out.println("选择红豆");
}
@Override
void add() {
System.out.println("添加红豆");
}
@Override
void soak() {
System.out.println("浸泡红豆");
}
@Override
void beat() {
System.out.println("打碎红豆");
}
}
class OnlySoyBeanMilk extends SoybeanMilk{
@Override
void select() {
}
@Override
void add() {
}
@Override
void soak() {
}
@Override
void beat() {
}
@Override
boolean needAdd(){
return false;
}
}
在Java的servlet中使用到了模板方法模式,servlet在service方法中,根据不同的请求类型找到不同方法,这些方法的具体细节由自定义的继承自HttpServlet的servlet来实现