为什么JdbcTemplate是Template方法设计模式的一个示例

时间:2015-10-15 16:00:03

标签: java spring algorithm design-patterns template-method-pattern

我正在阅读有关设计模式的信息,特别是有关模板方法的信息,当时我的注意力被this问题所捕获。

在阅读说明和具体代码后,我仍然想知道为什么这是“模板方法”设计模式的一个例子。

根据GoF的说法,这种模式的目的是:

  

“在操作中定义算法的骨架,将一些步骤推迟到子类。模板方法允许子类重新定义算法的某些步骤而不改变算法的结构。“

并有两位参与者:

  

AbstractClass
    - 定义具体子类定义以实现算法步骤的抽象基本操作     - 实现定义算法骨架的模板方法。模板方法调用原始操作以及在AbstractClass中定义的操作或其他对象的操作。
  的具体类
  实现原始操作以执行算法的子类特定步骤。

为什么'JdbcOperations'中的代码被认为是'模板方法'设计模式?

  • 我没有看到在超级/抽象类中定义任何“全局/通用”算法,即使我将它与类似'JmsTemplate'之类的文件中的代码进行比较。
  • 具体类中实现的所有函数都不在超类中定义。所有定义的方法都是通过使用接口添加的,在本例中是接口'JdbcOperations',而实际上没有覆盖父接口中的接口。

我认为它是extremely handy for eliminating boilerplate code。但为什么这是一个模板方法,而不仅仅是一个漂亮的编码技巧。对我而言,它看起来没有模板方法所具有的任何特征。

3 个答案:

答案 0 :(得分:2)

我同意 - JdbcTemplate不是模板方法设计模式的示例。使用的设计模式是callback

请注意,两种模式的目标和效果非常相似,主要区别在于模板方法使用继承而回调使用组合(排序) - 请参阅{ {3}}为什么这可能是首选。

答案 1 :(得分:1)

根据JdbcTemplate文档

  

它简化了JDBC的使用,有助于避免常见错误。它   执行核心JDBC工作流,让应用程序代码提供SQL   并提取结果。该类执行SQL查询或更新,   启动对ResultSet的迭代并捕获JDBC异常和   将它们转换为通用的,信息更丰富的异常层次结构   在org.springframework.dao包中定义。

JdbcTemplate为每个方法的内部工作提供抽象。对于例如insert()update()在内部使用所选数据库的具体类实现。 客户端代码不必知道或实现这些方法,因为它们由数据库供应商实现。这就是它与Template设计模式紧密匹配的原因。

答案 2 :(得分:1)

GoF中的两种设计模式代表了类似的想法 -

"在操作(Generic API)中定义算法的框架,并将一些专门步骤委派给客户端。

  1. 模板设计模式:专门化是通过子类化完成的。 (这不是JdbcTemplate中的方法。

  2. 策略:专业化由回调(委托)完成。 (这是JdbcTemplate中的方法。我们使用ResultSetExtractor之类的回调来提供特化逻辑)

  3. <强> JdbcTemplate is more a strategy than template.