模板模式
一、基本介绍
- 模式方法模式,又叫模板模式,在一个抽象类公开定义了执行它的方法的模板,它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。
- 模板方法模式定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤。
- 模板方法模式属于行为型模式。
二、原理类图
- AbstractClass抽象类,类中实现了模板方法,定义了算法的骨架,具体子类需要去实现其他的抽象方法。operation2,3,4
- ConcreteClass实现抽象方法operation2,3,4 以完成算法中的特定子类的相关步骤。
三、豆浆制作
1. 原理类图
2. 代码实现
- 抽象类,表示豆浆
// 抽象类,表示豆浆
public abstract class SoyaMilk {
// 模板方法
public final void make(){
select();
addCondiment();
soak();
beat();
}
// 选材料
void select(){
System.out.println("第一步,选择黄豆");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 添加不同的配料-抽象方法,子类实现
abstract void addCondiment();
// 浸泡
void soak(){
System.out.println("第三步,浸泡黄豆和配料。");
}
//
void beat(){
System.out.println("第四步,打豆浆");
}
}
- RedBeanSoyaMilk
// 子类实现
public class RedBeanSoyaMilk extends SoyaMilk{
@Override
void addCondiment() {
System.out.println("第二步,添加红豆");
}
}
- PeanutSoyaMilk
// 子类实现
public class PeanutSoyaMilk extends SoyaMilk {
@Override
void addCondiment() {
System.out.println("第二步,加入花生");
}
}
- Client
public class Client {
public static void main(String[] args) {
// 制作红豆豆浆
SoyaMilk soyaMilk = new RedBeanSoyaMilk();
long startTime = System.currentTimeMillis(); //获取开始时间
soyaMilk.make();//测试的代码段
long endTime = System.currentTimeMillis(); //获取结束时间
System.out.println("制作红豆豆浆,共花费时间" + (endTime - startTime));
}
}
四、模板方法模式的注意事项和细节
- 基本思想是:算法只存在于一个地方,也就是在父类中,容易修改.需要修改算法时,只要修改父类的模板方法或者已经实现的某些步骤,子类就会继承这些修改。
- 实现了最大化代码复用.父类的模板方法和已实现的某些步骤会被子类继承而直接使用。
- 即统一了算法,也提供了很大的灵活性。父类的模板方法确保了算法的结构保持不变,同时由子类提供部分步骤实现。
- 不足:每一个不同的实现都需要一个子类实现,导致类的个数增加,使得系统更加庞大。
- 一般模板方法都加上final关键字,防止子类重写模板方法。
- 模板方法模式使用场景:当要完成在某个过程,该过程要执行一系列步骤,这一系列的步骤基本相同,但其个别步骤在实现时,可能不同,通常考虑用模板方法模式来处理。