Skip to content

Instantly share code, notes, and snippets.

@Centaur
Created September 5, 2016 06:39
Show Gist options
  • Save Centaur/e8201ed565aae9673f39109dc19cbfc9 to your computer and use it in GitHub Desktop.
Save Centaur/e8201ed565aae9673f39109dc19cbfc9 to your computer and use it in GitHub Desktop.

Revisions

  1. Centaur created this gist Sep 5, 2016.
    58 changes: 58 additions & 0 deletions eventlisteners.scala
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,58 @@
    package org.snippets

    import scala.collection.mutable.ListBuffer
    import scala.reflect.ClassTag


    trait Event[T] {
    }

    trait EventListener[T] {
    def onEvent(event: Event[T])
    }

    trait Listenable[T] {
    val name: String
    val listeners: ListBuffer[EventListener[T]]
    }

    object Event {
    var cachedListenables: Map[ClassTag[_], Listenable[_]] = Map()

    implicit def eventIsListenable[T: ClassTag]: Listenable[T] = {
    val typ = implicitly[ClassTag[T]]
    cachedListenables.get(typ) match {
    case None =>
    val newVal = new Listenable[T] {
    override val name: String = s"Listeners of Event[${implicitly[ClassTag[T]]}]"
    override val listeners: ListBuffer[EventListener[T]] = ListBuffer()
    }
    cachedListenables = cachedListenables.updated(typ, newVal)
    newVal
    case Some(l) => l.asInstanceOf[Listenable[T]]
    }
    }
    }


    object TypedEvents {

    def dispatchEvent[T](event: Event[T])(implicit ev: Listenable[T]): Unit = {
    val listeners = ev.listeners
    println(s"Invoking ${ev.name} , ${ev.hashCode}(相同类型的Event应使用同一个listener集合)")

    listeners.foreach(listener => {
    listener.onEvent(event)
    })
    }


    def main(args: Array[String]): Unit = {
    import Event._
    dispatchEvent(new Event[Int] {})
    dispatchEvent(new Event[Int] {})
    dispatchEvent(new Event[Int] {})
    dispatchEvent(new Event[String] {})
    dispatchEvent(new Event[String] {})
    }
    }