Un peu de Scala
Voici un framework pubsub de la mort qui tue...
trait Idable {
val id = Bus.getId
def pub = Bus.pub(this)
def sub(p:Idable, f:()=>Unit) = Bus.sub(p,f)
}
object Bus {
val H = collection.mutable.HashMap[Long,List[()=>Unit]]()
def pub(p:Idable):Unit = H.get(p.id).map(fs=>fs.map(f=> f()))
def sub(p:Idable, f:()=>Unit):Unit = H.put(p.id,f :: H.get(p.id).getOrElse (List()))
var ID = 0
def getId:Long = {ID+=1; ID}
}
Il s'utilise assez simplement:
class Person (val name:String, var age:Int) extends Idable {
def setAge(x:Int) = {age = x; pub}
}
object Main extends App with Idable {
val p = new Person("me",33)
sub(p, ()=> println("p notified " + p.age))
p.setAge(34)
}
On utilise ici les closures bien sur, mais surtout les traits: Idable contient le comportement nécessaire à la signalisation via l'objet singleton Bus et aussi l'interface d'utilisation : pourvu qu'on soit "Idable", l'id et le Bus sont absolument invisibles.
Viva Scala !
Commentaires
https://github.com/lihaoyi/scala.rx
est un framework récent, plus puissant que ces quelques lignes...