模板设计模式
豆浆制作问题
编写制作豆浆的程序,说明如下:
1)制作豆浆的流程,选材–>添加配料–>浸泡–>放到豆浆机磨
2)通过添加不同的配料,可以制作出不同的口味的豆浆
3)选材、浸泡和放豆浆机打碎这几个步骤对于制作每种口味都是一样的
4)请使用模板方法模式完成(说明:因为模板方法模式,比较简单,很容易就想到这个方案,因此就直接使用,不在使用传统的方案来引出模板方法模式)
1、模板方法模式
基本介绍
1)模板方法模式(Template Method Pattern),又叫做模板模式(Template Pattern),在一个抽象类公开定义了执行它的方法的模板,它的子类可以按需要重写方法的实现,但调用将以抽象类中定义的方式进行
2)简单来说,模板方法模式定义一个操作中的算法的故交,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重新定义该算法的某些特定步骤
3)这种类型的设计模式属于行为型模式。
对原理类图的说明
1)AbstractClass抽象类,类中实现模板方法(template),定义了算法的骨架,具体子类需要去实现其他的抽象方法operationr2,3,4
2)ConcreteClass实现抽象方法operationr2,3,4,以完成算法中特点子类的步骤
应用实例
1)应用实例要求
-
制作豆浆的流程,选材–>添加配料–>浸泡–>放到豆浆机打碎
-
通过添加不同的配料,可以制作出不同口味的豆浆
-
选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的(红豆、花生豆)
2)思路分析
package designPatterns.template;
public abstract class SoyaMilk {
public void make() {
select();
//如果用户想要添加辅料,则添加辅料,默认添加,false不添加
if (customerWondiments())
add();
soak();
beat();
}
//添加辅料
abstract public void add();
//选择豆子
protected void select() {
System.out.println("选择黄豆作为原材料");
}
//浸泡
protected void soak() {
System.out.println("浸泡");
}
//磨
protected void beat() {
System.out.println("磨豆机");
}
//钩子函数,用户是否想要添加辅料
public boolean customerWondiments() {
return true;
}
}
package designPatterns.template;
//原味豆浆
public class OriginalSoyaMilk extends SoyaMilk {
@Override
public void add() {
}
//不添加辅料
@Override
public boolean customerWondiments() {
return false;
}
}
package designPatterns.template;
public class BlackBeanSoyaMilk extends SoyaMilk{
@Override
public void add() {
System.out.println("添加黑豆子作为辅料");
}
}
package designPatterns.template;
public class TestMain {
public static void main(String[] args){
SoyaMilk blackBeanSoyaMilk = new BlackBeanSoyaMilk();
blackBeanSoyaMilk.make();
System.out.println("==========================");
SoyaMilk originalSoyaMilk = new OriginalSoyaMilk();
originalSoyaMilk.make();
}
}
模板方法模式的狗子函数
1)在模板方法模式的父类中,我们可以定义一个方法,它默认不做任何事情,子类可以视情况要不要覆盖它,该方法成为”狗子“
2)还是用上面做豆浆的例子来说,比如,我们还希望制作纯豆浆,不添加任何的配料
模板方法模式在Spring框架的运用源码分析
1)SpringIOC容器初始化时应用到模板方法模式
2)代码分析
针对源码的类图
模板方法模式的注意事项和细节
1)基本思想是:算法只存在于一个地方,也就是在父类中,容易修改,需要修改算法时,只需要该父类的模板方法或者已经实现的某些步骤,子类就会继承这些修改
2)实现了做大化代码复用,父类的模板方法和已经实现的某些步骤会被子类继承而直接使用
3)即统一了算法,也提供了很大的灵活性。父类的模板方法确保了算法的结构保持不变同时由子类体提供部分步骤的实现
4)该模式的不足之处:每一个不同的实现都需要一个子类实现,导致类的个数增加,使得系统更加庞大
5)一般模板方法模式使用场景:当要完成在某个过程,该过程要执行一系列步骤,这一系列步骤基本相同,但其个别步骤在实现时可能不同,通常考虑模板方法模式来处理