Skip to content

4. 模板方法模式

Landy.Liu edited this page May 18, 2019 · 1 revision

4.1 概念

定义一个算法的骨架,将骨架中的特定步骤延迟到子类中。模板方法模式使得子类可以不改变算法的结构即可重新定义该算法的某些特定步骤。

4.2 模版方法模式与策略模式比较

  1. 策略模式:只有选择权(由用户自定义选择已有的算法)
  2. 模版模式:侧重点不是选择,你没得选择,你必须这么做。但是你可以参与其中某部分的内容

4.3 实现方式

4.3.1 继承方式

继承方式是常见方式,模板方法模式展示了经典重用的一种形式,通用算法被放在基类中,通过继承在不同的子类中实现该通用算法。

参见4.4.1 继承方式

4.3.2 回调接口方式

Template Method模式一般是需要继承的。这里想要探讨另一种对Template Method的理解。 Spring中的JdbcTemplate,在用这个类时并不想去继承这个类,因为这个类的方法太多,但是我们还是想用到JdbcTemplate已有的稳定的、公用的数据库连接,那么我们怎么办呢?我们可以把变化的东西抽出来作为一个参数传入 JdbcTemplate 的方法中。但是变化的东西是一段代码,而且这段代码会用到JdbcTemplate中的变量。怎么办?那我们就用回调对象吧。在这个回调对象中定义一个操纵JdbcTemplate中变量的方法,我们去实现这个方法,就把变化的东西集中到这里了。然后我们再传入这个回调对象到JdbcTemplate,从而完成了调用。这就是Template Method不需要继承的另一种实 现方式。

参见4.4.2 回调接口方式

4.4 demo

4.4.1 继承方式

我们通过定义通用类BubbleSorter,把冒泡排序的算法骨架放在基类,然后实现不同的子类分别对int数组、double数组、List集合进行排序。但这样是有代价的,因为继承是非常强的关系,派生类不可避免地与基类绑定在一起了。但如果我现在需要用快速排序而不是冒泡排序来进行排序, 但快速排序却没有办法重用setArray、getLength、needSwap和swap方法了。不过,策略模式提供了另一种可选的方案。

事例代码包:org.landy.template.method.sort

4.4.2 回调接口方式

JdbcTemplate

事例代码包:org.landy.template.method.jdbc