设计模式(17):模板方法TEMPLATEMETHOD

模板方法模式

意图

定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。


使用场景

模板方法应用于下列情况:

  • 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
  • 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。首先识别现有代码中的不同之处,并且将不同之处分离为新的操作。最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。
  • 控制子类扩展。

结构

模板方法结构如下
ShowImage

  • AbstractClass

    – 定义抽象的基本操作(Primitive Operation),具体的子类将重写它们来实现一个指定算法的步骤。

    – 实现一个模板方法,定义一个算法的骨架。该模板方法不仅调用接口中的基本操作,也调用定义在AbstractClass或其他对象中的操作。

  • ConcreteClass

    – 实现基本操作来完成算法中与指定子类相关的步骤。

协作

ConcreteClass靠AbstractClass来实现算法中不变的步骤。


效果

模板方法模式是一种代码复用的基本技术。它们在类库中尤为重要,它们提取了类库中的公共行为。

  • 模板方法模式使得扩展性更好
  • 模板方法指定了逻辑,如果为模板方法添加final修饰符,那么子类也不能去修改逻辑。
  • 钩子方法(Hook Method)在抽象中提供一个方法的空实现,子类可以根据自身需要来决定是否进行实现扩展。

模板方法模式实现(Implement)

案例

戴尔显示器在显示器的市场占有一席之地,现在要对安装戴尔显示器的过程进行实现。在安装显示器的过程中,一般有开箱,安装底座,连接显示器以及设置四个步骤,这里可以使用模板方法对安装过程进行实现。

代码实现

定义安装戴尔显示器的接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/*安装戴尔显示器的接口*/
interface InstallDellMonitor {
/*给出默认的安装顺序*/
default void install() {
unwrapPacking();
attachStand();
connectMonitor();
setupInSystem();
}
/*拆开包装*/
default void unwrapPacking() {
System.out.println("拆开纸箱包装...");
}
/*将屏幕安装到显示器底座上*/
void attachStand();
/*连接显示器与主机*/
void connectMonitor();
/*在系统中进行设置*/
void setupInSystem();
}

安装型号U2515H显示器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/*安装戴尔U2515H显示器*/
public class InstallDellU2515H implements InstallDellMonitor {
@Override
public void attachStand() {
System.out.println("安装U2515H底座,装上屏幕...");
}
@Override
public void connectMonitor() {
System.out.println("将U2515H显示器与主机进行连接...");
}
@Override
public void setupInSystem() {
System.out.println("在系统中设置U2515H显示器...");
}
}

安装型号U2417H显示器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/*安装戴尔U2417H显示器*/
public class InstallDellU2417H implements InstallDellMonitor {
@Override
public void attachStand() {
System.out.println("安装U2417H显示器底座,装上屏幕...");
}
@Override
public void connectMonitor() {
System.out.println("将U2417H显示器与主机进行连接...");
}
@Override
public void setupInSystem() {
System.out.println("在系统中设置U2417H显示器...");
}
}

进行安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class TemplateMethodTest {
/*安装U2515H*/
@Test
public void installDellU2515HTest() {
InstallDellU2515H installDellU2515H = new InstallDellU2515H();
installDellU2515H.install();
}
/*安装U2417H*/
@Test
public void installDellU2417HTest() {
InstallDellU2417H installDellU2417H = new InstallDellU2417H();
installDellU2417H.install();
}
}

总结

模板方法结构比较简单,提高了系统的灵活性与扩展性。

参考代码

------ 本文结束 ------

版权声明


BillyYccc's blog by Billy Yuan is licensed under a Creative Commons BY-NC-SA 4.0 International License.
本文原创于BillyYccc's Blog,转载请注明原作者及出处!