En el patrón de delegado , solo un objeto puede escuchar directamente los eventos de otro objeto. En el patrón de observación , cualquier número de objetos puede escuchar los eventos de un objeto en particular. Al diseñar una clase que necesita notificar a otro (s) objeto (s) de eventos, ¿por qué usaría el patrón delegado sobre el patrón observador? Veo el patrón de observador como más flexible. Es posible que ahora solo tenga un observador, pero un diseño futuro puede requerir múltiples observadores.
9
Respuestas:
No hay un patrón de delegado per se. Voy a suponer que te refieres al patrón de delegación .
Según tengo entendido, son el reverso completo el uno del otro y se utilizan para diferentes propósitos.
Generalmente, con un patrón de observador , cualquier número de objetos de observador escuchará un evento en un segundo objeto y actuará en el evento. El segundo objeto no tiene conocimiento de sus oyentes. Simplemente los llama.
Se pasa un objeto delegado al segundo objeto que llama a métodos directamente en el delegado. Y ahí radica la ventaja que estás buscando. En lugar de enviar un solo mensaje a múltiples oyentes, tiene control completo sobre un solo objeto (en un momento dado). Ver también Inversión de control .
fuente
Estás mirando las cosas incorrectamente. Un observador ve que ocurre un evento particular. No lo impacta, ni lo posee. Un delegado maneja un evento en particular y tiene la propiedad del controlador, incluso si el delegador posee la interfaz para el evento.
fuente
Esa es una cuestión de varias compensaciones.
Compensaciones:
Patrón delegado:
Patrón de observador:
fuente
El patrón de delegado, según tengo entendido, se conoce como el mecanismo de controlador de eventos en otros idiomas, por ejemplo, Delphi. Como tal, simplemente es una implementación del patrón de observador con una restricción importante: solo un oyente a la vez.
La desventaja de los controladores de eventos o delegados es obvia: solo un observador.
La ventaja no es tan obvia: el rendimiento. Con un patrón de observador puede agregar muchos observadores. Cuando se produce un evento sobre el que se debe notificar a los observadores, deberá enumerarlos y enviar una notificación a cada uno. Esto puede atascar rápidamente cualquier instancia observada, especialmente cuando el número de eventos que requieren notificación también es significativo.
fuente
int (*my_int_f)(int)
en C). Siempre pensé que lo habrían hecho más fácil de entender al hacerlo funcionar más como struct / enum. Un evento es un enlace para una variedad flexible de oyentes, que utiliza una sola firma de delegado. Usted podría hacerlo sin un evento (por lo que supongo que la OP significaba patrón de Delegación, que es muy diferente), pero el lenguaje está haciendo más fácil para usted.Esta es una publicación antigua, pero de todos modos voy a intervenir porque las otras respuestas no tratan con lo que sucede cuando se usa cualquiera de los patrones, parecen estar más relacionados con la teoría que con la práctica.
Cómo funcionan la delegación y el observador
Con Delegación, el delegador elige exactamente quién responderá a un evento en particular en el momento en que se crea la fuente del evento potencial. Se podría pensar en este oyente como un solo observador . En el caso del patrón Observador, el observador elige a quién está observando cuando lo desea; así que las dependencias se invierten cuando se trata de observador frente a delegación. Con el patrón de observador, piense en un periódico y suscriptores como observadores. Los observadores tienen el control de cuándo se crea la relación. Con delegación piense en un empleado y un empleador. El empleador tiene el control de cuándo se crea la relación y exactamente quién está a cargo de eventos específicos. Los empleados no pueden elegir en qué tareas están trabajando ... en general.
Algunos argumentan que la delegación puede tener un observador, pero creo que la verdadera diferencia entre los dos es cómo se asigna el manejo de eventos. Nunca verá un delegado registrarse para un evento. Nunca sabrá si está manejando el evento hasta que ocurra y el delegador llame a un método público.
Ventaja de delegación
Este patrón es muy rígido y con los diseños más habituales es más simple y generalmente más robusto. Te obliga a declarar tu controlador de eventos por adelantado al momento de inicializar la fuente del evento potencial. Si necesita que alguien dirija el tráfico, asigne un director de tráfico antes de abrir la calle. En el caso del observador, dejaría que el policía de tráfico elija cuándo dirigir el tráfico cada vez que lo desee.
Desventaja de delegación
La desventaja de este diseño es que no es flexible. Si implementara algún código para suscribirse a un periódico, el periódico / delegado tendría que identificar exactamente quién puede leer las noticias en el momento en que se crean. Con el patrón de observador, pueden registrarse más adelante en cualquier momento y el periódico solo tendrá que saber que una nueva persona se ha registrado.
¿Cuándo elegir la delegación?
Cuando necesite un observador (es) específico (s) con seguridad y no haya razón para cambiar quién está observando, entonces el diseño rígido del patrón de delegación será beneficioso.
Por ejemplo, necesita una clase / objeto para manejar la creación de una ventana emergente para un error específico. No hay muchas razones por las cuales en tiempo de ejecución necesitaría cambiar quién está manejando un error específico, por lo que delegar el error "Memoria insuficiente" a una sola entidad tendría sentido. Crear una matriz de posibles controladores y luego hacer que esos controladores se registren para el error "Memoria insuficiente" no tendría mucho sentido; eso sería un ejemplo del uso del patrón de observador en esta situación. En el tiempo de ejecución, es posible que desee cambiar qué métodos se llaman o qué "delegado" se llama para eventos variables, pero cambiar un controlador de eventos por un evento específico en tiempo de ejecución no es normal.
No es imposible intercambiar delegados como lo haría en el patrón de observación, es simplemente complicado. En el mundo real, tal vez desee intercambiar policías de tráfico para que un nuevo delegador esté manejando el tráfico. Se podría argumentar que un mejor diseño haría que el delegado original fuera una estación de policía y no un solo oficial de policía, sino que estoy divagando ...
fuente