ejemplo java design-patterns delegates callback

ejemplo - Delegado vs Callback en Java



callback javascript (3)

Argumentaría que "devolución de llamada" es un nombre para un patrón genérico en el que se proporciona el módulo al que se está llamando de manera que dicho módulo llame a su código. Delegado AC #, o un objeto delegado ObjC, (estas dos bestias son completamente diferentes) o una clase Java implementando la interfaz de devolución de llamada son diferentes formas específicas de plataforma para implementar el patrón de devolución de llamada. (También pueden considerarse patrones.) Otros idiomas tienen formas más o menos sutilmente diferentes de hacerlo.

El concepto anterior de "delegado" también es similar al patrón de Estrategia, donde el delegado puede considerarse como uno solo. Del mismo modo, un visitante también es un tipo de devolución de llamada. (Un visitante también es una estrategia para procesar cada elemento visitado).

Todo esto está usando definiciones que son intuitivas para mí, y que pueden no serlo para nadie más, porque ni "devolución de llamada" ni "delegar" son términos formales y tiene poco sentido discutirlos sin consultar una definición anterior que sea válida en su contexto. En consecuencia, tiene poco sentido preguntar cuál es la definición, ya que, según mi leal saber y entender, no existe una autorizada. A saber, el hecho de que otras respuestas a esta pregunta puedan decir algo completamente diferente.

Mi recomendación sería centrarme en los méritos de su diseño, ya sea que logre lo que necesita, no introduzca un acoplamiento ajustado, etc., en lugar de concentrarse en las semánticas de la semántica. Cuando dos patrones de diseño parecen similares, probablemente se puedan usar para lograr objetivos similares igualmente bien.

Tengo algunos malentendidos sobre los términos de los delegados y las devoluciones de llamadas en Java.

class MyDriver { public static void main(String[] argv){ MyObject myObj = new MyObject(); // definition of HelpCallback omitted for brevity myObj.getHelp(new HelpCallback () { @Override public void call(int result) { System.out.println("Help Callback: "+result); } }); } } class MyObject { public void getHelp(HelpCallback callback){ //do something callback.call(OK); } }

¿Es de devolución de llamada o delegado ( son los delegados y devoluciones de llamada lo mismo o similar? )?

¿Cómo implementar luego otro?


Lo que desea lograr es una comunicación bidireccional entre la persona que llama original y un servicio, evitando al mismo tiempo que el servicio dependa del cliente. El patrón que usa para ese objetivo a menudo depende de las restricciones de su idioma. Utiliza punteros de función, cierres o, si no tiene ninguno de estos, objetos de devolución de llamada (que también pueden verse como cierres).

Y a menudo hay muchos nombres diferentes para el mismo patrón o uno muy similar.


Esta es una devolución de llamada. De acuerdo con Wikipedia :

En la programación de computadoras, una devolución de llamada es una referencia a un fragmento de código ejecutable que se pasa como argumento a otro código.

Entonces, veamos el código ejecutable:

public void getHelp(HelpCallback callback){ //do something callback.call(OK); }

Aquí, el argumento de callback es una referencia a un objeto de tipo HelpCallback . Como esa referencia se pasa como un argumento, es una devolución de llamada.

Un ejemplo de delegación

La delegación se realiza internamente por el objeto, independientemente de cómo se invoca el método. Si, por ejemplo, la variable de callback no era un argumento, sino una variable de instancia:

class MyDriver { public static void main(String[] argv){ // definition of HelpStrategy omitted for brevity MyObject myObj = new MyObject(new HelpStrategy() { @Override public void getHelp() { System.out.println("Getting help!"); } }); myObj.getHelp(); } } class MyObject { private final HelpStrategy helpStrategy; public MyObject(HelpStrategy helpStrategy) { this.helpStrategy = helpStrategy; } public void getHelp(){ helpStrategy.getHelp(); } }

... entonces sería una delegación.

Aquí, MyObject usa el patrón de estrategia . Hay dos cosas a tener en cuenta:

  1. La invocación de getHelp() no implica pasar una referencia al código ejecutable. es decir, esto no es una devolución de llamada.
  2. El hecho de que MyObject.getHelp() invoca helpStrategy.getHelp() no es evidente desde la interfaz pública del objeto MyObject o desde la invocación getHelp() . Este tipo de ocultamiento de información es algo característico de la delegación.

También es de destacar la falta de una sección // do something en el método getHelp() . Cuando se utiliza una devolución de llamada, la devolución de llamada no hace nada relevante para el comportamiento del objeto: simplemente notifica a la persona que llama de alguna manera, por lo que una sección // do something era necesaria. Sin embargo, cuando se utiliza la delegación, el comportamiento real del método depende del delegado, por lo que realmente podríamos necesitar ambos, ya que tienen fines distintos:

public void getHelp(HelpCallback callback){ helpStrategy.getHelp(); // perform logic / behavior; "do something" as some might say if(callback != null) { callback.call(); // invoke the callback, to notify the caller of something } }