java设计模式-模板方法模式
模板方法模式
- 编写制作豆浆的程序,说明如下
1)制作豆浆的流程选材添加配料浸泡放到豆浆机打碎
2)通过添加不同的配料,可以制作出不同口味的豆浆
3)选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的
4)请使用模板方法模式完成 说明: 因为模板方法模式,比较简单, 很容易就想到这个方案 ,因此就直接使用,不再使用传统的方案来引出模板方法模式
原理图
1、AbstractClass抽象类,类中实现了模板方法(template),定义了算法的骨架,具体子类需要去实现,其他的抽象类方法operation2,3,4
2、ConcreteClass实现抽象方法operation2,3,4已完成算法中特定子类的步骤
@Slf4j
public abstract class SoyaMilk {
//模板方法 make 模板方法可以做成final,不让子类去覆盖
final void make() {
select();
addCondiments();
soak();
beat();
}
//选择材料
void select() {
log.info("第一步:选择好的新鲜黄豆");
}
//添加不同的配料,抽象方法,子类具体实现。
abstract void addCondiments();
//浸泡
void soak() {
log.info("第三步:黄豆和配料开始浸泡,需要3小时");
}
//打浆
void beat() {
log.info("第四步:黄豆和配料放到豆浆机中去打碎。");
}
}
@Slf4j
public class PeanutSoyaMilk extends SoyaMilk{
@Override
void addCondiments() {
log.info("第二步:加入花生");
}
}
@Slf4j
public class RedBeanSoyaMilk extends SoyaMilk{
@Override
void addCondiments() {
log.info("第二步:加入红豆");
}
}
@Slf4j
public class Client {
public static void main(String[] args) {
log.info("------制作红豆豆浆------");
RedBeanSoyaMilk redBeanSoyaMilk = new RedBeanSoyaMilk();
redBeanSoyaMilk.make();
log.info("=====================================");
log.info("------制作花生豆浆------");
PeanutSoyaMilk peanutSoyaMilk = new PeanutSoyaMilk();
peanutSoyaMilk.make();
}
}
------制作红豆豆浆------
- 第一步:选择好的新鲜黄豆
- 第二步:加入红豆
- 第三步:黄豆和配料开始浸泡,需要3小时
- 第四步:黄豆和配料放到豆浆机中去打碎。
=====================================
------制作花生豆浆------
- 第一步:选择好的新鲜黄豆
- 第二步:加入花生
- 第三步:黄豆和配料开始浸泡,需要3小时
- 第四步:黄豆和配料放到豆浆机中去打碎。
钩子方法
在模板方法模式的父类中,我们可以定义一个方法,不做任何事,子类可以去视为情况要不要覆盖它,称之为钩子程序。
@Slf4j
public abstract class SoyaMilk {
//模板方法 make 模板方法可以做成final,不让子类去覆盖
final void make() {
select();
if (customerWantCondiments()) {
addCondiments();
}
soak();
beat();
}
//......
//钩子方法,决定是否需要添加配料
boolean customerWantCondiments() {
return true;
}
}
@Slf4j
public class PureSoyaMilk extends SoyaMilk {
@Override
void addCondiments() {
//空实现
}
@Override
boolean customerWantCondiments() {
return false;
}
}
@Slf4j
public class Client {
public static void main(String[] args) {
log.info("=====================================");
log.info("------制作纯豆浆------");
SoyaMilk pureSoyaMilk = new PureSoyaMilk();
pureSoyaMilk.make();
}
}
=====================================
------制作纯豆浆------
- 第一步:选择好的新鲜黄豆
- 第三步:黄豆和配料开始浸泡,需要3小时
- 第四步:黄豆和配料放到豆浆机中去打碎。
- 模板方法在源码中的应用(spring IOC源码分析)
模板方法的注意事项和细节
1、基本的思想是:算法只存在于一个地方,也就是在父类中容易修改。,
需要修改算法时,只要修改父类的模板方法或者已经实现的某些步骤,子类就会继承这些修改。
2、实现了最大化代码复用,父类的模板方法和已经实现的某些步骤被直接的继承而直接使用。
3、即同意了算法,也提供了很大的灵活性。父类的模板方法确保了算法的结构保持不变,同时有子类提供部分步骤的实现。
4、该模式的不足之处:每一个不同的实现都需要一个子类实现,刀之类的个数增加,是的系统更加庞大。
5、一般末班方法都加上final关键字。发囊之子类重写模板方法。
6、模板方法模式使用场景。当要完成某个过程,该过程要执行一系列步骤,这一系列的步骤基本相同,
但是个别步骤在实现时有可能不同,通常考虑用模板方法模式来处理。