代码之家  ›  专栏  ›  技术社区  ›  Jeb

Scala侦听器/观察器

  •  15
  • Jeb  · 技术社区  · 15 年前

    通常,在Java中,当我有一个对象向其他对象提供某种通知时,我将采用Listener/observator模式。

    有没有更像Scala的方法?我应该在Scala中使用这个模式,还是应该在我应该利用的语言中加入其他东西?

    4 回复  |  直到 15 年前
        1
  •  20
  •   Dmitry Leskov    11 年前

    您仍然可以累积回调列表,但是您可以使它们成为函数,而不必再提出另一个方法接口。

    例如

    case class MyEvent(...)
    
    object Foo { 
      var listeners: List[MyEvent => ()] = Nil
    
      def listen(listener: MyEvent => ()) {
        listeners ::= listener
      }
    
      def notify(ev: MyEvent) = for (l <- listeners) l(ev) 
    }
    

    this somewhat-related paper 如果你想吃红色药丸。:)

        2
  •  18
  •   Alexey Romanov    11 年前

    有没有更像Scala的方法?

    对。读报纸 Deprecating the Observer Pattern 作者:Ingo Maier、Tiark Rompf和Martin Odersky。

    更新27-Apt-2015: Deprecating the Observer Pattern with Scala.React 作者:梅尔和奥德斯基。

        3
  •  4
  •   Brian    15 年前
    trait Observer[S] {
         def receiveUpdate(subject: S);
    }
    
    trait Subject[S] {
         this: S =>
         private var observers: List[Observer[S]] = Nil
         def addObserver(observer: Observer[S]) = observers = observer :: observers
    
         def notifyObservers() = observers.foreach(_.receiveUpdate(this))
    }
    

    http://blog.objectmentor.com/articles/2008/08/03/the-seductions-of-scala-part-i

    这使用了Scala的一些特性,比如用[S]表示的泛型,类似于Java接口但功能更强大的traits,::在观察器列表中预先添加一个观察器,以及一个foreach,其参数使用一个来计算当前观察器。

        4
  •  2
  •   IttayD    15 年前

    你可以用scala.collection.mutable变量.Publisher和scala.collection.mutable变量.Subscriber创建发布/订阅实现

    推荐文章