模板方法模式
1. 简介
- 模板方法模式又称
模板模式
。指在一个抽象类中定义了使用它的方法的模板,子类可以按需实现某些方法,但是方法的执行还是按照抽象类中定义的顺序【模板】进行。 - 换言之,模板方法模式规定了一个操作的算法骨架,而部分细节实现则可以延迟到子类实现。该模式在保证算法骨架的不变性的同时,为其中的细节实现提供了可变性。
- 该模式属于行为型模式。
2.场景设定
- 豆浆制作有固定的步骤:选材==》添加配料==》浸泡==》放到豆浆机打碎。
- 除了添加配料在不同口味豆浆中的操作不一样外,其他步骤在每次制作过程中都是一样的。
- 通过模板方法模式设计豆浆制作过程
3. 实现
3.1 类关系图
3.2 SoyaMilk抽象类
public abstract class SoyaMilk {
public final void make(){
selectSoya();
addCondiments();
soak();
beat();
}
public void selectSoya(){
System.out.println("选择上好的黄豆。。。");
}
public abstract void addCondiments();
public void soak(){
System.out.println("材料开始浸泡。。。。");
}
public void beat(){
System.out.println("放入豆浆机搅拌。。。");
}
}
3.3 具体豆浆类
public class PeanutSoyaMilk extends SoyaMilk{
@Override
public void addCondiments() {
System.out.println("添加美味的花生酱。。。");
}
}
public class SugarSoyaMilk extends SoyaMilk{
@Override
public void addCondiments() {
System.out.println("添加美味的糖果...");
}
}
3.4 客户端类
public class Client {
public static void main(String[] args) {
SoyaMilk peanutSoyaMilk = new PeanutSoyaMilk();
peanutSoyaMilk.make();
SoyaMilk sugarSoyaMilk = new SugarSoyaMilk();
sugarSoyaMilk.make();
}
}
4. 模板方法模式中的钩子
- 在模板方法模式的抽象类中,可以定义一个方法【其子类看需求要不要重写该方法】,该方法称为
钩子
- 如,若现在需要制作纯豆浆,即不需要执行步骤2,使用钩子解决该需求。
public boolean isAddCondiments(){
return true;
}
public final void make(){
selectSoya();
if (isAddCondiments()){
addCondiments();
}
soak();
beat();
}
public class PureSoyaMilk extends SoyaMilk{
@Override
public void addCondiments() {
}
@Override
public boolean isAddCondiments() {
return false;
}
}
5. 在Spring中的应用
- Spring IOC 容器初始化的时候,使用了模板方法模式。
6. 总结
- 模板方法模式的基本思想是:算法骨架只存在特定父类中。当需要变更算法骨架,则只需要修改一处。
- 实现了代码复用的最大化。
- 提供了很大的灵活性,父类的算法骨架保证了整体的统一性,子类的可以实现部分细节,保证了细节的灵活性。
- 缺点:每一个不同的实现都需要一个子类,可能导致类过多。
- 一般模板方法都会加上final关键字,防止子类重写模板方法。
- 使用场景:若某个过程包含一些列相同的步骤,且只在个别步骤的实现上有所差别,通常考虑使用模板方法来实现。
后序
- 我是一名大三本科生,专业是软件工程【一本】。目前,正在准备找实习以及秋招,意向岗位是Java后端开发工程师。为此,在码云托管了一个项目,以整理我所有所学知识。涉及内容:计算机网络、操作系统、Java基础、主流Java后端框架、设计模式、Web前端框架等内容。欢迎大家访问我的开源项目编程之路
- 码云地址:https://gitee.com/alizipeng/the-way-of-programming
- 以上内容均记载在我的开源项目中