文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
1.17 模板方法模式
模板方法模式 抽象出一些算法的细节。算法的通用部分都包含在一个基本类中。特定实现细节也就位于这些基本类中。所包括的类的常见模式如下所示:
1.17.1 范例
在该范例中, Accumulator
会获取累计算法的核心细节信息。基本类 Sum
和 Product
用来提供特定的自定义方式,以便使用通用的累计算法。
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论