本文介绍23种设计模式之模板方法模式。
定义
在一个方法中定义了一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤
描述
- 模式名称:TEMPLATE METHOD(模板方法)
- 类型:类行为型模式
- 意图:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。 模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
- 适用性:
- 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
- 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。
- 控制子类扩展。通过hook(钩子)控制子类扩展。
- 效果:
- 优点:
- 模板方法是一种代码复用的基本技术。它们在类库中尤为重要,它们提取了类库中的公共行为。
- 行为由父类控制,子类实现。
- 缺点:
- 实现类的个数过多会增加维护成本。
类图
- AbstractClass(抽象类):负责给出一个算法的轮廓和骨架。包含:模板方法,抽象方法,具体方法,钩子方法。
- ConcreteClass(具体类):实现所有抽象方法。
实现代码
AbstractClass
public abstract class AbstractClass {
final void templateMethod(){
primitiveOperation1();
primitiveOperation2();
hook();
}
abstract void primitiveOperation1();
abstract void primitiveOperation2();
void hook(){
System.out.println("默认的钩子方法");
}
}
ConcreteClass
public class ConcreteClass extends AbstractClass {
@Override
void primitiveOperation1() {
System.out.println("原始操作1的实现被调用...");
}
@Override
void primitiveOperation2() {
System.out.println("原始操作2的实现被调用...");
}
@Override
void hook() {
super.hook();
System.out.println("变成实现的钩子方法");
}
}
Client
public class Client {
public static void main(String[] args) {
AbstractClass concreteClass = new ConcreteClass();
concreteClass.templateMethod();
}
}
执行结果:
原始操作1的实现被调用...
原始操作2的实现被调用...
默认的钩子方法
变成实现的钩子方法