设计模式之模板模式

模板模式

模板模式

模板方法模式(Template Method Pattern)又叫模板方法模式,是指定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤,属于行为型设计模式。

模板方法模式实际上是封装了一个固定流程,该流程由几个步骤组成,具体步骤可以由子类进行不同实现,从而让固定的流程产生不同的结果。它非常简单,其实就是类的继承机制,但它却是一个应用非常广泛的模式。模板方法模式的本质是抽象封装流程,具体进行实现。

通用UML图

image-20210424172102550

从UML类图中,可以看到,模板方法模式主要包含两种角色

抽象模板(AbstractClass):抽象模板类,定义了一套算法框架/流程;

具体实现(ConcreteClass):具体实现类,对算法框架/流程的某些步骤进行了实现。

通用代码

抽象模板(AbstractClass)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public abstract class AbstractClass
{
public void templateMethod()
{
step1();
step2();
}

protected void step1()
{
System.out.println("AbstractClass step1");
}

protected void step2()
{
System.out.println("AbstractClass step2");
}

}

具体实现(ConcreteClass)

ConcreteA

1
2
3
4
5
6
7
8
public class ConcreteA extends AbstractClass
{
@Override
public void step1()
{
System.out.println("ConcreteA step1");
}
}

ConcreteB

1
2
3
4
5
6
7
8
public class ConcreteB extends AbstractClass
{
@Override
public void step2()
{
System.out.println("ConcreteB step2");
}
}

测试代码

1
2
3
4
5
6
7
8
9
10
11
public class Main
{
public static void main(String[] args)
{
ConcreteA concreteA = new ConcreteA();
concreteA.templateMethod();
System.out.println();
ConcreteB concreteB = new ConcreteB();
concreteB.templateMethod();
}
}

输出

1
2
3
4
5
ConcreteA step1
AbstractClass step2

AbstractClass step1
ConcreteB step2

应用场景

当完成一个操作具有固定的流程时,由抽象固定流程步骤,具体步骤交给子类进行具体实现(固定的流程,不同的实现)。

在我们日常生活中模板方法模式也很常见。

比如我们平时办理入职流程填写入职登记表一打印简历一复印学历一复印身份证一签订劳动合同一建立花名册一办理工牌一安排工位等;

再比如,我平时在家里炒菜:洗锅一点鈥一热锅一上油一下原料一翻炒一放调料一出锅;

再比如有个小品,赵本山问宋丹丹:“如何把大象放进冰箱?”宋丹丹回答:“第一步:打开冰箱门,第二步:把大象塞进冰箱,第三步:关闭冰箱门”。赵本山再问:“怎么把长劲鹿放进冰箱?”宋丹丹答:“第一步:打开冰箱门,第二步:把大象拿出来,第三步:把长劲鹿塞进去,第四步:关闭冰箱门”,这些都是模板方法模式的体现。

模板方法模式在源码中的体现

JDK中的AbstractList 使用的就是模板模式,来看代码:

1
2
3
4
5
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {
...
abstract public E get(int index);
...
}

我们看到get()是一个抽象方法,那么它的逻辑就是交给子类来实现,我们大家所熟知的ArrayList就是AbstractList的子类。同理,有AbstractList就有AbstractSet和AbstractMap。

还有一个每天都在用的HttpServlet,有三个方法service()和doGet0、doPost()方法,都是模板方法的抽象实现。

模板方法模式的优缺点

优点:

1、利用模板方法将相同处理逻辑的代码放到抽象父类中,可以提高代码的复用性。

2、将不同的代码不同的子类中,通过对子类的扩展增加新的行为,提高代码的扩展性。

3、把不变的行为写在父类上,去除子类的重复代码,提供了一个很好的代码复用平台,符合开闭原则。

缺点:

1、类数目的增加,每一个抽象类都需要一个子类来实现,这样导致类的个数增加。

2、类数量的增加,间接地增加了系统实现的复杂度。

3、继承关系自身缺点,如果父类添加新的抽象方法,所有子类都要改一遍。

打赏

请我喝杯咖啡吧~

支付宝
微信