Strategy pattern in Scala

策略模式在《Design Patterns: Elements of Reusable Object-Oriented Software》的定义

Define a family of algorithms, encapsulate each one, and make them inter changeable.Strategy lets the algorithm vary independently from clients that use it.

策略模式中的角色

  • Strategy策略接口或者(抽象策略类),定义策略执行接口
  • ConcreteStrategy具体策略类
  • Context上下文类,持有具体策略类的实例,并负责调用相关的算法

对于策略模式的优缺点或者代码样例可以参考电子工业出版社的《Java 与模式》和清华大学出版社的《Java设计模式》

下面将重点介绍在函数式编程中如何实现策略模式

object StrategyPattern {

  //计算代数平均值
  def strategyOne(scores: Array[Double]): Double = {
    var sum: Double = 0
    scores.foreach(s => sum = sum + s)
    sum/scores.length
  }

  //计算几何平均值
  def strategyTwo(scores: Array[Double]): Double = {
    var multi: Double = 1
    scores.foreach(s => multi = multi * s)
    Math.pow(multi, 1.0/scores.length)
  }

  //返回具体的计算方法
  def setStrategy(concreteStrategy: (Array[Double]) => Double) = {
    (scores: Array[Double]) => {
      concreteStrategy(scores)
    }
  }
  
  def main(args: Array[String]): Unit = {
    val a = Array(9.12, 9.25, 8.87, 9.99, 6.99, 7.88)
    val b = Array(9.15, 9.26, 8.97, 9.89, 6.97, 7.89)

    //val compute = setStrategy(strategyOne)
    val compute = setStrategy(strategyTwo)
    println(compute(a))
    println(compute(b))
  }
}

在上面的例子中定义了两种求平均值的算法strategyOnestrategyTwo相当于策略模式中的ConcreteStrategy,而setStrategy函数相当于Context。
此模式的重点在于setStrategy函数,它的参数是函数类型,返回值也是一个函数,所以setStrategy函数就可以根据不同的输入算法得到统一的计算函数,如本例中的val compute = setStrategy(strategyTwo),从而实现了面向对象编程中策略模式的功能。

返回目录

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,780评论 18 399
  • 1 场景问题# 1.1 报价管理## 向客户报价,对于销售部门的人来讲,这是一个非常重大、非常复杂的问题,对不同的...
    七寸知架构阅读 5,136评论 9 62
  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 7,881评论 2 17
  • 一、什么是rsync rsync是一款开源,快速,多功能的可实现增量的本地或远程的数据镜像同步备份的优秀工具。适用...
    逗比punk阅读 2,475评论 0 1
  • 走在冬天 走过芳菲尽谢的街头 我在等,头顶绽出大片的雪 或者几支圆舞曲寂然落下 怅然回旋耳边 你的手指晶莹,纤细 ...
    澍恊人生阅读 193评论 0 0