分享
为什么问答平台  ›  专栏  ›  技术社区  ›  adelarsq

设计模式和scala - Design Patterns and Scala

  •  13
  • adelarsq  · 技术社区  · 2 周前

    我编写这个问题是为了维护一个与scala、标准模式或仅此语言相关联的设计模式的寄存器。

    相关问题:

    感谢所有的贡献者

    3 回复  |  直到 5 年前
        1
  •  6
  •   Synesso    5 年前

    像这样的列表已经被整理过了。见 https://wiki.scala-lang.org/display/SYGN/Design+Patterns

        2
  •  7
  •   soc    8 年前

    让我们从 “单件模式” :

    object SomeSingleton //That's it
    

    我会另外提议 “使用高阶模式的函数” . 您可以为类提供的方法提供函数,而不是自己迭代集合。

    在scala中,你基本上说你打算做什么:

    //declare some example class
    case class Person(name: String, age: Int) 
    
    //create some example persons
    val persons = List(Person("Joe", 42), Person("Jane", 30), Person("Alice", 14), Person("Bob", 12))
    
    //"Are there any persons in this List, which are older than 18?"
    persons.exists(_.age > 18)
    // => Boolean = true
    
    //"Is every person's name longer than 4 characters?"
    persons.forall(_.name.length > 4)
    // => Boolean = false
    
    //"I need a List of only the adult persons!"
    persons.filter(_.age >= 18)
    // => List[Person] = List(Person(Joe,42), Person(Jane,30))
    
    //"Actually I need both, a list with the adults and a list of the minors!"
    persons.partition(_.age >= 18)
    // => (List[Person], List[Person]) = (List(Person(Joe,42), Person(Jane,30)),List(Person(Alice,14), Person(Bob,12)))
    
    //"A List with the names, please!"
    persons.map(_.name)
    // => List[String] = List(Joe, Jane, Alice, Bob)    
    
    //"I would like to know how old all persons are all together!"
    persons.foldLeft(0)(_ + _.age)
    // => Int = 98
    

    在Java中这样做将意味着自己触摸一个集合的元素,并将应用逻辑与流量控制代码混合。

    More information 关于集合类。


    这个不错 EPFL paper 关于 贬低观察者模式 可能也很有趣。


    Typeclasses 是一种构造继承并不真正适合的类的公共特性的方法。