豆浆制作问题
- 制作豆浆的流程:选材——添加配料——浸泡——放到豆浆机打碎
- 通过添加不同的配料,可以制作不同口味的都将
- 选材、浸泡和放到豆浆机中打碎这些步骤针对不同的豆浆都是一样的
模板方法模式
基本介绍
- 在抽象类中公开定义了执行它的方法的模板,子类可以按需要重写方法实习那,但调用将以抽象类中定义的方式进行
- 简单的说,模板方法模式定义了一个操作中算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构,就可以重定义该算法某些特定步骤
- 模板方法模式属于行为型模式
原理
AbstarctClass中的template方法定义了operation方法执行的逻辑,但operation方法没有具体实现,子类通过继承该类,实现这些细节方法,再通过父类模板向外提供调用
- AbsractClass:类中实现了模板方法,定义了算法的股价,具体方法需要子类去实现
- ConcreteClass:实现了抽象方法,来完成template中定义的算法步骤中的细节
钩子方法
在模板方法中,存在这样一个方法,这个方法不是抽象的,但是没有实现体,定义为一个默认的行为,子类可以视情况要不要覆盖它,这个方法称为钩子
模板方法解决豆浆制作问题
/***
* @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来实现