「这是我参与2022首次更文挑战的第8天,活动详情查看:2022首次更文挑战」。
1.模板方法模式简介
模板方法模式(Template Method Pattern):也叫模板模式。定义一个操作中的算法骨架,而将算法的一些步骤的具体实现延迟到子类中,使得子类可以不改变该算法结构的情况下,重定义该算法的某些特定步骤。它是一种行为型设计模式。
它把不可变的部分封装到父类里,可变的部分可以交给子类扩展。打个简单的例子,即一个人要上大学,他必须先小学毕业,然后初中毕业,然后高中毕业,才能参加高考,考上大学。这一系列流程属于不可变的部分,每个上大学的人都要经历的。至于在哪上小学,初中,高中,什么时候上的,这属于可变部分,每个孩子都不一定相同。
2.uml 类图
通过这个结构图,我们可以发现它的在父类中封装了不可变部分,利于代码复用,此外它符合开闭原则,对修改关闭,对扩展开放,子类可以根据自己的需要重写 可变部分的代码。通常不可变部分的方法我们可以给它加个 final 修饰,防止子类重写。他的缺点也比较明显,即每有一种新的情况就要重新定义一个子类,当子类很多时,会增加系统复杂度,且父类新增一个抽象方法,每个子类都需要重写,不易维护。
3. 代码结构
1.模板类(抽象类)
public abstract class AbstractClass {
// 固定的模板方法,子类不能重写
public final void template(){
operation1();
operation2();
operation3();
}
public abstract void operation1();
public abstract void operation2();
public abstract void operation3();
}
- 具体的实现类
// 子类重写,模板种允许自定义的方法
public class ConcreteClass extends AbstractClass {
@Override
public void operation1() {
System.out.println("第一步操作");
}
@Override
public void operation2() {
System.out.println("第二步操作");
}
@Override
public void operation3() {
System.out.println("第三步操作");
}
}
4.应用案列
在SpringIoC容器初始化中的 refresh() 方法种就会使用这种模式,这个方法的详解见 Spring IOC容器初始化原理分析