一、模板方法模式的定义
模板方法模式的定义如下:
定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。(Define the skeleton of an algorithm in an operation,deferring some steps to subclasses.Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure.)
模板方法(Template Method)是一个比较简单的模式。它的主要思想是,定义一个操作的一系列步骤,对于某些暂时确定不下来的步骤,就留给子类去实现好了,这样不同的子类就可以定义出不同的步骤。
因此,模板方法的核心在于定义一个“骨架”。
模板方法模式类图如下:
二、源码案例
JDK中有很多地方用到了模板方法模式
1、java.io.InputStream
InputStream
是抽象类,定义了读取输入流的模板方法 read()
。具体的输入流实现类(如 FileInputStream
、ByteArrayInputStream
等)会实现 read()
方法来提供特定的读取逻辑。
2、java.util.AbstractList
AbstractList
是 List
接口的抽象实现类,它实现了 List
接口的大部分方法,其中包括 get()
、add()
、remove()
等。这些方法都是模板方法,它们的实现依赖于抽象方法 get(int index)
、add(int index, E element)
、remove(int index)
等,具体的 List
实现类需要提供这些抽象方法的实现。
3、java.util.Collections
Collections
类提供了一系列静态方法来操作集合,其中一些方法使用了模板方法模式。例如,Collections.sort()
方法使用了模板方法来实现排序算法,具体的排序逻辑由传入的比较器对象实现。
三、钩子
所谓钩子就是提供一种机制,父类提供抽象方法或者默认实现的方法,子类通过继承覆写该方法,以达到修改父类默认模板方法的执行逻辑的目的。
有了钩子方法模板方法模式才算完美,由子类的一个方法返回值决定公共部分的执行结果,就很有吸引力不是。
四、总结
分离变与不变是软件设计的一个基本原则,它是面向对象设计“开闭原则”的体现:对扩展开放,对修改关闭。模板模式将不变的部分封装在基类的骨架方法中,而将变化的部分通过钩子方法进行封装,交给子类去提供具体的实现,在一定程度上优美地阐述了“分离变与不变”这一软件设计原则。
注意:本文归作者所有,未经作者允许,不得转载