文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
1.16 策略模式
策略模式(Strategy Pattern) 可以在使用过程中抽象出特定算法,允许切换算法而根本不需要改变调用指令。该模式的一般形式为:
在 Groovy 中,由于把代码看做使用匿名方法(宽泛地叫做 闭包 )的第一类对象,策略模式的用武之地变少了。可以直接把算法放入闭包中即可。
1.16.1 范例
封装策略模式的典型用法如下所示:
interface Calc {
def execute(n, m)
}
class CalcByMult implements Calc {
def execute(n, m) { n * m }
}
class CalcByManyAdds implements Calc {
def execute(n, m) {
def result = 0
n.times{
result += m
}
result
}
}
def sampleData = [
[3, 4, 12],
[5, -5, -25]
]
Calc[] multiplicationStrategies = [
new CalcByMult(),
new CalcByManyAdds()
]
sampleData.each{ data ->
multiplicationStrategies.each { calc ->
assert data[2] == calc.execute(data[0], data[1])
}
}
定义了一个接口 Calc
,它将由具体的策略类来实现(也可以使用一个抽象类)。然后,为了简单的乘法运算,我们定义了两种算法: CalcByMult
是普通方式, CalcByManyAdds
只使用加法(不要使用负数,虽然可以解决这个问题,但那样范例代码就太长了)。使用标准的 polymorphism 来调用这些算法。
更为 Groovy 的方式是使用闭包:
def multiplicationStrategies = [
{ n, m -> n * m },
{ n, m -> def result = 0; n.times{ result += m }; result }
]
def sampleData = [
[3, 4, 12],
[5, -5, -25]
]
sampleData.each{ data ->
multiplicationStrategies.each { calc ->
assert data[2] == calc(data[0], data[1])
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论