Example Observer

Another example is the implementation of the Observer Pattern:

package orp.coc.examples.observer
import orp.coc._
import scala.collection.mutable.ListBuffer

trait Subject {
  @any(classOf[ListBuffer[Observer]]) var observers: Observer = _
  def notifyObservers {
    observers().update(this)
  }
}

trait Observer {
  def update(s: Subject): Unit
}

case class NamedObserver(val name: String) extends Observer {
  override def update(s: Subject) {
    println("update of " + name + " from " + s)
  }
}

case class NamedSubject(val name: String) extends Subject
object ObserverApp extends App {
  val subject1 = new NamedSubject("Subject1")
  val subject2 = new NamedSubject("Subject2")
  val observer1 = NamedObserver("observer1")
  val observer2 = NamedObserver("observer2")
  val observer3 = NamedObserver("observer3")
  subject1.observers_+=(observer1)
  subject1.observers_+=(observer2)
  subject2.observers_+=(observer2)
  subject2.observers_+=(observer3)
  subject1.notifyObservers
  subject2.notifyObservers
}