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 ...