Notes de font

Un Callback és una referència a una acció executable (no l’acció en si) que usualment és passada com un argument a una altra funció. És com si ens passen un control remot i ens indiquen “això és per encendre els llums”; a l’pressionar podria no ser així, ja que només tenim una referència de la funció. La part de codi que fa la crida a l’acció callback, mitjançant aquesta referència (que per exemple li va ser passada com a argument), l’executa “confiant” en qui li va passar l’argument.
Exemple d’un Mosso a Suposem clients d’un Restaurant internacional, que li fan comandes a un mosso, en diferents idiomes. Necessitem que aquestes comandes arribin traduïts a l’cuiner. a El mosso fa aquests encàrrecs a el cuiner, sempre en espanyol.

  ---- - \ | - > --- > | ----- /  

a Tornant a el control remot, suposem que se li donés als clients un control remot amb un botó (una referència), i ells ho pressionen quan volen per exemple cafè , però com vam ser nosaltres els que li vam donar el teclat, l’efecte podria ser qualsevol cosa, ells només decideixen quan pressionar-lo, però és el restaurant qui controla quina acció hi ha darrere.
Aquesta és la tasca de l’mosso, és un mitjà indirecte que tenen els clients per “fer la comanda a l’cuiner”, ho fan disparant una acció a través de l’mosso, confien que el mosso sabrà què fer (tal com seria confiar en el botó) per tant quan els clients fan la comanda (en qualsevol idioma) en realitat s’executa una acció equivalent de fer la comanda a l’cuiner (però en l’únic idioma que entén).
en aquest exemple, una forma de fer-ho en Java.
es necessita a

  • Una interfície per definir el format de l’callback (Característiques de l’control remot, Mosso Multilingue)
  • Classes que accepten com a argument el callback (Clients que confien en el Restaurant)
  • Classe Mosso que implementa la interfície (Defineix què fer cada vegada que es diu a l’callback)

a

  • Interfície
      public interface CamareroMultilingue {public void pedirCafe (); // Poden ser molts més mètodes ...}  
  • Un client que parla espanyol a
      public class ClaseEsp {// interfície que permet que la comanda sigui interpretat fora d'aquesta classe private CamareroMultilingue demanat; private boolean fam; // variable exemple // constructor public ClaseEsp (CamareroMultilingue p) {demanat = p; } Public void processa () {fam = true; if (fam) {System.out.println ( "Bon dia, un cafè si us plau"); pedido.pedirCafe (); }}}  
  • Un client que parla francès
      public class ClaseFra {// interfície que permet que la comanda sigui interpretat fora d'aquesta classe private CamareroMultilingue demanat; private boolean fam; // variable exemple // constructor public ClaseFra (CamareroMultilingue p) {demanat = p; } Public void processa () {fam = true; if (fam) {System.out.println ( "Bonjour, un cafè s'il vous plaît?"); pedido.pedirCafe (); }}}  
  • Un client que parla anglès a
      public class ClaseIng {// interfície que permet que la comanda sigui interpretat fora d'aquesta classe private CamareroMultilingue demanat; private boolean fam; // variable exemple // constructor public ClaseIng (CamareroMultilingue p) {demanat = p; } Public void processa () {fam = true; if (fam) {System.out.println ( "Good morning, can I have a coffee please?"); pedido.pedirCafe (); }}}  
  • Un mosso a
      public class Restaurant {public static void main (String args) {class mosso implements CamareroMultilingue {public void pedirCafe () {System.out.println ( "el mosso li demana a l'cuiner: UN JAVA!"); System.out.println ( ""); }} // Notar que la interfície és publica perquè han de conèixer-la // totes les classes que la contenen com a propietat // però! les classes que la implementen poden ser privades, internes, etc. // cadascuna que implementi pot tenir l'abast i la implementació que vulgui // sempre que respecti els mètodes i camps mínims que proposa la interfície. Mosso mozoInterprete = new Mosso (); // Clients, a l'ingressar a al bar se li assigna un mosso interpreti (en aquest cas el mateix) ClaseEsp ce = new ClaseEsp (mozoInterprete); ClaseFra cf = new ClaseFra (mozoInterprete); ClaseIng ci = new ClaseIng (mozoInterprete); // acció! es processa la comanda dels clients ce.procesa (); cf.procesa (); ci.procesa (); }}  

    Sortida a

      Bon dia, un cafè per favorEl mosso li demana a l'cuiner : UN JAVA! Good morning, can I have a coffee please?El mosso li demana a l' cuiner : UN JAVA ! Bonjour , un cafè s'il vous plaît ? El mosso li demana a l' cuiner : UN JAVA !  

Hi ha una altra manera de fer-ho ? Sí , una altra forma és utilitzant una classe abstracta, aquesta classe implementa alguns mètodes però altres els podem deixar ” buits ” perquè alguna classe l’estengui i els pugui implementar , els defineixi la funcionalidad.Evidentemente aquesta és una altra manera de fer callback , ja que la classe abstracta pot trucar als mètodes cada vegada que els necessita ( d’acord a alguna funció esperada ) , i el contingut d’aquests mètodes ( què és el que realment fan ) es defineix fora, en la classe que l’estén .

Deixa un comentari

L'adreça electrònica no es publicarà. Els camps necessaris estan marcats amb *