0%

模板方法模式

模板方法模式

定义一个操作中的算法骨架,将一些步骤延迟在子类中实现,使得子类可以不改变一个算法的结构即可自定义该算法的某些特定步骤

文档模板填空

模板方法模式

在该模式中的抽象模板有三种方法:

  • 抽象方法:父类中只声明不实现,由子类实现,在模板方法中被调用
  • 模板方法:一个算法框架,实现对抽象方法的调度,完成固定的逻辑,对于一些不允许被改变的模板方法,一般都加上final关键字
  • 钩子方法:由抽象类声明并实现,子类可以去扩展
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/**
* 模板类
* @author zh
* @date 2022/10/16 16:29
*/
public abstract class AbstractTemplate {

public abstract void doThings1();

public abstract void doThings2();

// 模板方法
public final void templateMethod(){
doThings1();
doThings2();
}
}

public class Concrete extends AbstractTemplate{
@Override
public void doThings1() {
System.out.println("doThings1");
}

@Override
public void doThings2() {
System.out.println("doThings2");
}
}

优缺点

优点

  • 容易扩展,模板方法是不发生改变的部分,而抽象方法是发生变化的部分,只需要增加实现类来实现抽象方法即可
  • 比较灵活,因为钩子方法可以进行扩展
  • 提取公共部分代码,便于维护
  • 行为由父类控制,子类实现

缺点

  • 算法骨架不容易升级

使用场景

  • 多个子类有公有的方法,并且逻辑基本相同
  • 重要复杂的算法,可以把核心算法设计为模板方法,其他的相关细节功能由子类实现,如线程池的ThreadPoolExecutor
  • 需要固定定义算法骨架,实现一个算法的不变部分,控制子类扩展,并把可变的行为留给子类
  • 需要控制子类扩展的情况,模板方法模式会在特定的点来调用子类的方法,这样就只允许在这些点进行扩展

欢迎关注我的其它发布渠道