模板方法(Template Method Pattern)又叫模板模式,是一种行为型设计模式,其在一个抽象类中定义了执行方法的模板,由子类按需重写方法实现,但调用却以抽象类中定义的方式进行。其角色主要分为两类:
AbstractClass抽象类:该类中实现了模板方法,定义了算法的骨架,具体子类需要去实现
ConcreteClass:实现抽象方法的具体子类

1、实际应用——豆浆制作
要求:
编写制作豆浆的程序,制作豆浆流程包括:选材->添加配料->浸泡->放到豆浆机打碎
通过添加不同的配料,可以制作出不同口味的豆浆
选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的。
采用模板方法解决的类图如下:

public abstract class SoyaMilk {
public final void make(){
select();
add();
soya();
beat();
}
public void select(){
System.out.println("第一步:选黄豆");
}
public abstract void add();
public void soya(){
System.out.println("第三步:浸泡");
}
public void beat(){
System.out.println("第四步:打碎");
}
}
class BlackbeanSoyaMilk extends SoyaMilk{
@Override
public void add() {
System.out.println("第二步:加红豆");
}
}
//客户端
public class Client {
public static void main(String[] args) {
SoyaMilk blackbeanSoyaMilk = new BlackbeanSoyaMilk();
blackbeanSoyaMilk.make();
}
}
2、模板方法的钩子方法
在模板方法的父类中,我们可以定义一个方法,它默认不做任何事,子类可以视情况要不要覆盖它,该方法称为“钩子”,以此来控制父类中方法的实现与否。如下,修改代码决定是否添加配料
public abstract class SoyaMilk {
public final void make(){
select();
if (isAdd()){
add();
}
soya();
beat();
}
public void select(){
System.out.println("第一步:选黄豆");
}
public abstract void add();
public void soya(){
System.out.println("第三步:浸泡");
}
public void beat(){
System.out.println("第四步:打碎");
}
//钩子方法,是否添加配料
public boolean isAdd(){
return true;
}
}
class BlackbeanSoyaMilk extends SoyaMilk{
@Override
public void add() {
System.out.println("第二步:加红豆");
}
@Override
public boolean isAdd() {
return false;
}
}
3、总结
模板方法实现了最大化代码复用,父类的模板方法和已实现的某些步骤会被子类继承而直接使用,其统一了算法,也提供了很大的灵活性。
通常当要完成某个过程,该过程要执行一系列步骤,这一系列的步骤基本相同,但其个别步骤在实现时可能不同,可以考虑模板方法模式来处理。
往期回顾
UML类图的六大关系
八种单例模式分析
由浅入深工厂模式
原型模式及深浅拷贝详解
建造者模式
适配器设计模式
桥接模式
外观模式
享元模式
史上最全代理模式讲解
更多精彩,关注“咋家”

网友评论