8Fermer10
Pen^2Le 25/08/2015 à 19:58
./7 pencil

En gros ça donne ça :

interface DataChanged {
   dataChanged() ;//granularité à choisir en fonction du contexte
}


class MonUi implements DataChanged {
  MonUi
  {
     k.addDataChangedListener(this) ;
  }
   Kernel k ;

  @override
  dataChanged()
  {
     myTextArea.setText(k.myText) ;
  }

   buttonCallback()
   {
      kernel.doStuff() ;
   }
}



class Kernel {
   list<DatachangedListerner> list ;
   addDataChangedListener( datachanged dc )
  {
    list.add(dc) ;
  }

   private void notifyAllDataChangedListeners()
  {
    foreach DatachangedListerner dc in list {
      dc.dataChanged() ;
    }
  }

   doStuff()
  { 
    try {
       //fait des trucs que seul un kernel peut faire !!
        //...
       //...
    }
    finally {
         notifyAllDataChangedListeners() ;
    }
   }
}





//--------------
class MonLog implements DataChanged {
  MonUi 
  {
     k.addDataChangedListener(this) ;
  }
   Kernel k ;

  @override
  dataChanged()
  {
     printf(k.myText) ;
  }
}


//--------

main {
   Kernel k ;//instance unique du kernel

   MonUI gui(k) ;
   
   MonLog log(k) ;
}
C'est un peu bancal mais ça illustre quand même le fait que deux media se mettent à jour (le gui et le log) à la suite d'une seule action.
Évidemment le second écouteur ne fait qu'écouter, mais tu pourrais faire aussi un autre pilote à base de CLI qui vienne remplacer MonUI.
L'important c'est en effet que ta couche métier (Kernel) doit être une API qui permette de piloter toute ton application (et c'est la seule qui modifie les données)



(je ne me suis pas trop relu donc désolé si c'est pas clair embarrassed)