【问题标题】:Why is JdbcTemplate an example of the Template method design pattern为什么 JdbcTemplate 是模板方法设计模式的一个例子
【发布时间】:2016-01-14 04:33:13
【问题描述】:

我正在阅读有关设计模式的内容,尤其是有关模板方法的内容,这时我的注意力被关于 SO 的this 问题引起了。

在阅读了解释和具体代码后,我仍然想知道为什么这是“模板方法”设计模式的示例。

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

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

并且有两个参与者:

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


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

  • 我没有看到在超级/抽象类中定义了任何“全局/通用”算法,即使我将它与类似文件中的代码(如“JmsTemplate”)进行比较。
  • 在具体类中实现的功能均未在超类中定义。所有定义的方法都是通过使用接口添加的,在本例中是接口“JdbcOperations”,实际上没有一个方法会覆盖父级中的方法。

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

【问题讨论】:

  • 我认为你怀疑JdbcTemplate 是模板模式的一个例子是正确的(如链接问题中接受的答案所述)。
  • 它封装了常见的 JDBC 代码(例如,tx 管理)并遵循回调而不是子类——我认为这种区别没有用。这可能不是一个很好的例子,但是嗯。
  • 别忘了查看 SpringTemplate,它可以更轻松地使用 Spring 框架...

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


【解决方案1】:

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

“在操作中定义算法的骨架(通用API),并将一些专门的步骤委托给客户端。

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

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

JdbcTemplate is more a strategy than template.

【讨论】:

    【解决方案2】:

    根据JdbcTemplate 文档

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

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

    【讨论】:

      【解决方案3】:

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

      请注意,这两种模式的目标和效果非常相似,主要区别在于 模板方法 使用继承,而 回调 使用组合(有点) - 见@ 987654322@ 了解为什么这可能是首选。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-05
        • 2012-10-05
        • 1970-01-01
        • 2019-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多