返回介绍

1.17 模板方法模式

发布于 2025-01-04 00:44:55 字数 1852 浏览 0 评论 0 收藏 0

模板方法模式 抽象出一些算法的细节。算法的通用部分都包含在一个基本类中。特定实现细节也就位于这些基本类中。所包括的类的常见模式如下所示:

TemplateMethodClasses

1.17.1 范例

在该范例中, Accumulator 会获取累计算法的核心细节信息。基本类 SumProduct 用来提供特定的自定义方式,以便使用通用的累计算法。

abstract class Accumulator {
  protected initial
  abstract doAccumulate(total, v)
  def accumulate(values) {
    def total = initial
    values.each { v -> total = doAccumulate(total, v) }
    total
  }
}

class Sum extends Accumulator {
  def Sum() { initial = 0 }
  def doAccumulate(total, v) { total + v }
}

class Product extends Accumulator {
  def Product() { initial = 1 }
  def doAccumulate(total, v) { total * v }
}

println new Sum().accumulate([1,2,3,4])
println new Product().accumulate([1,2,3,4])

结果输出为:

10
24

在这种特殊的情况下,可以使用 Groovy 的注入方法来实现相似的结果(使用闭包):

Closure addAll = { total, item -> total += item }
def accumulated = [1, 2, 3, 4].inject(0, addAll)
println accumulated  // => 10

感谢 duck-typing,同样也适用于支持 add 方法(Groovy 中是 plus() )的对象。比如:

在这种特殊的情况下,可以使用 Groovy 的注入方法来实现相似的结果(使用闭包):

accumulated = [ "1", "2", "3", "4" ].inject("", addAll)
println accumulated  // => "1234"

也可以像下面这样来处理乘法:

Closure multAll = { total, item -> total *= item }
accumulated = [1, 2, 3, 4].inject(1, multAll)
println accumulated  // => 24

像这样来使用闭包看起来更像是 策略模式 ,但如果我们意识到内建的注入方法是模板方法算法的通用部分,闭包就会成为模板方法模式的自定义部分。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文