1、例子
编写制作豆浆的程序,说明如下
:
1)
制作豆浆的流程 选材
--->
添加配料
--->
浸泡
--->
放到豆浆机打碎
2)
通过添加不同的配料,可以制作出不同口味的豆浆
3)
选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的
4)
请使用
模板方法模式
完成
(
说明:因为模板方法模式,比较简单,
很容易就
想到这个方案
,因此就直接使用,不再使用传统的方案来引出模板方法模式
)
2、基本定义
1、模版方法模式,又叫模版模式,在一个抽象类公开定义了执行他的方法的模板,它的子类可以按需重新方法实现,单调用将抽象类中定的方式进行
2、简单说,模版方法模式定义一个操作中的算法的骨架。而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤
3、这种类型的设计模式属于行为模式
public abstract class SoyaMilk {
//模版方法,make,模式方法可以作为final,不让子类去覆盖
final void make(){
select();
addCondiments();
soak();
beat();
}
void select(){
System.out.println("第一步:选择");
}
abstract void addCondiments();
void soak(){
System.out.println("第三部,开始中和");
}
void beat(){
System.out.println("第四部,开始中和");
}
}
public class RedBeanSoyMilk extends SoyaMilk {
@Override
void addCondiments() {
System.out.println("第二部:加入");
}
}
public class Clinet {
public static void main(String[] args) {
System.out.println("制作");
SoyaMilk milk=new RedBeanSoyMilk();
milk.make();
}
}
总结:就是如果是同一个流程,可以抽象出来。把流程设置为不可变方法
3、钩子方法
3.1、在模版方法模式的父类中,我们可以定一个方法。它默认不做任何事,子类可以视情况要不要覆盖它,该方法称为"钩子"
public abstract class SoyaMilk {
//模版方法,make,模式方法可以作为final,不让子类去覆盖
final void make(){
select();
if(customerWant()){
addCondiments();
}
soak();
beat();
}
void select(){
System.out.println("第一步:选择");
}
abstract void addCondiments();
void soak(){
System.out.println("第三部,开始中和");
}
void beat(){
System.out.println("第四部,开始中和");
}
//钩子方法,决定是否需要添加配料
boolean customerWant(){
return true;
}
}
总结
就是加参数,判断操作流程不变的额方法