模板模式
制作豆浆的抽象类
abstract class SoyaMilk{
final void make(){
select();
addCondiments();
soak();
beat();
}
void select(){
System.out.println("第一步:选择新鲜的黄豆");
}
abstract void addCondiments();
void soak(){
System.out.println("第三步:黄豆和配料开始浸泡3个小时");
}
void beat(){
System.out.println("第四步:制作豆浆");
}
}
不同豆浆的实现类
class RedBeanSoyaMilk extends SoyaMilk{
@Override
void addCondiments() {
System.out.println("第二步:添加红豆");
}
}
class PeanutSoyaMilk extends SoyaMilk{
@Override
void addCondiments() {
System.out.println("第二步:添加花生");
}
}
测试类
public class TemplateTest {
public static void main(String[] args) {
SoyaMilk milk = new RedBeanSoyaMilk();
milk.make();
SoyaMilk milk2 = new PeanutSoyaMilk();
milk2.make();
}
}
模板模式钩子方法
为抽象类添加钩子方法
abstract class SoyaMilk{
final void make(){
select();
if (customerWantCondiments()) {
addCondiments();
}
soak();
beat();
}
void select(){
System.out.println("第一步:选择新鲜的黄豆");
}
abstract void addCondiments();
void soak(){
System.out.println("第三步:黄豆和配料开始浸泡3个小时");
}
void beat(){
System.out.println("第四步:制作豆浆");
}
boolean customerWantCondiments(){
return true;
}
}
不需要任何配料的豆浆类
class PureSoyaMilk extends SoyaMilk{
@Override
void addCondiments() {
}
@Override
boolean customerWantCondiments() {
return false;
}
}
测试类
public class TemplateTest {
public static void main(String[] args) {
PureSoyaMilk pureSoyaMilk = new PureSoyaMilk();
pureSoyaMilk.make();
}
}