返回介绍

1.16 策略模式

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

策略模式(Strategy Pattern) 可以在使用过程中抽象出特定算法,允许切换算法而根本不需要改变调用指令。该模式的一般形式为:

StrategyClasses

在 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 技术交流群。

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

发布评论

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