Skip to content

Latest commit

 

History

History

template-method

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 

模板方法 Template

✨模式类型✨✨ ✨✨难度✨ ✨ ✨✨实用性✨✨ ✨✨重要程度✨✨ ✨✨经典性✨✨ ✨✨历史性✨
行为型模式 ★★ ⬇️ ★★★★ ⬆️ ★★★★★ ⬆️ 💚 ⬆️ 💚 ⬆️

概念

模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式

用途

定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。主要解决一些方法通用,却在每一个子类都重写了这一方法。

模式架构

模板方法模式通过抽象类将一些通用、复杂算法或重要的方法提炼到模板抽象类中,将其他业务逻辑代码剥离出来,供其他具体模板类去实现完成。这样可以将不同的业务方法进行独自展开维护,而不需要修改其他的实现。当通用、复杂算法被修改,整个系统被统一修改

参与角色对象

  • AbstractTemplate:抽象模板类,抽象模板类定义具体模板类需要实现的不同的方法,将相同或复杂的方法在抽象模板类中完成。
  • ConcreteTemplate:具体模板类,继承AbstractTemplate抽象模板类完成未实现的或需要实现的方法。

UML关系图

1545970176273

优点与缺点

  • 优点

    • 封装不变部分,扩展可变部分。
    • 提取公共代码,便于维护。
    • 行为由父类控制,子类实现。
  • 缺点

    • 每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大

代码实现

模板方法模式的实现要点如下:

  • 定义AbstractTemplate抽象模板类,在类中完成通用公共的方法实现,将不同的方法定义为抽象方法供子类去实现。同时在抽象类中提供行为控制的方法,完成业务。
  • 定义ConcreteTemplate具体模板类,继承AbstractTemplate抽象模板类完成未实现的抽象方法。
  • 可选的定义StrategyContext策略上下文对象,进行切换不同的ConcreteTemplate具体模板类,在策略上下文对象中调用AbstractTemplate抽象模板类完成业务和模板类的选择切换。

示例参考

应用场景

模板方法模式适用于:

  • 有多个子类共有的方法,且逻辑相同:许多相关类只在他们的行为上有所不同。策略提供了一种将类配置为多种行为之一的方法
  • 需要不同的算法变体。例如,可以定义反映不同空间/时间权衡的算法。当这些变体作为算法的类层次结构实现时,可以使用策略
  • 重要的、复杂的方法:算法使用客户端不应该知道的数据。使用策略模式可避免暴露复杂的特定于算法的数据结构。
  • 一个类定义了许多行为,这些行为在其操作中显示为多个条件语句。而不是很多条件,将相关的条件分支移动到自己的Strategy类中。

应用实例参考

JavaSDK

  • java.util.Collections#sort()
  • java.io.InputStream#skip()
  • java.io.InputStream#read()
  • java.util.AbstractList#indexOf()

GoSDK

PythonSDK

JavaScript Libs

总结

  • 模板模式中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。
  • 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。主要解决一些方法通用,却在每一个子类都重写了这一方法。
  • 模板方法模式通过抽象类将一些通用、复杂算法或重要的方法提炼到模板抽象类中,将其他业务逻辑代码剥离出来,供其他具体模板类去实现完成。这样可以将不同的业务方法进行独自展开维护,而不需要修改其他的实现。当通用、复杂算法被修改,整个系统被统一修改
  • 模板方法模式的优点有:封装不变部分,扩展可变部分;提取公共代码,便于维护;行为由父类控制,子类实现。
  • 模板方法模式适用于:有多个子类共有的方法,且逻辑相同;需要不同的算法变体;重要的、复杂的方法;一个类定义了许多行为,这些行为在其操作中显示为多个条件语句。而不是很多条件,将相关的条件分支移动到自己的Strategy类中。