2009-04-30 11 views
13

Soy un desarrollador de alto nivel, pero no he tenido una gran cantidad de entrenamiento formal y, aunque he utilizado muchos patrones de diseño y los he visto en mis años como desarrollador, nadie se desvió de su camino para decirlo. "Oh, este es un patrón de observador, o este es un patrón de Singleton".¿En qué se diferencia el patrón Observer de un modelo impulsado por eventos?

Al leer algunos de los patrones de diseño, me encontré con el patrón Observer y parece ser muy similar a la forma en que funcionan los eventos de .NET Framework. ¿Me estoy perdiendo algo fundamental acerca de esto?

Respuesta

19

El modelo de eventos .NET es más o menos una implementación integrada del patrón de observadores en el tiempo de ejecución de lenguaje común. Los lenguajes .NET implementan el observador directamente en su idioma de manera específica, utilizando el soporte incorporado del marco para esto.

En la mayoría de los lenguajes de programación, el patrón de observador requiere desarrollo personalizado o bibliotecas.

Viene de forma gratuita como parte del lenguaje en C#, VB.NET y en la mayoría de los otros lenguajes creados para usar el CLR.

+4

.NET no es un lenguaje, .NET es un entorno de tiempo de ejecución. –

+4

Es cierto. Me refería al CLR, más que un idioma específico, pero no era específico en mi publicación. Editado para ser más claro. Gracias por el comentario. –

1

¿Por qué crees que debe haber una diferencia?

¿No crees que los diseñadores de .NET leen Design Patterns también?

En realidad, el patrón Observer (como todos en el libro) era bien conocido mucho antes de que fueran categorizados y nombrados por el Gof4. Se utilizó para implementar el modelo de evento .Net, así como los modelos de eventos Win32 & Win16, y probablemente muchos otros.

+1

No dije que debe haber una diferencia. Estaba preguntando si me perdí algo.(-1 no respuesta agresiva) –

+1

Lol @ no respuesta agresiva – Janie

+0

esta respuesta es buena +1 – chikak

4

Muchos modelos de eventos, como Java 1.1 y versiones posteriores, así como el modelo de eventos .NET son básicamente implementaciones del patrón Observer.

Tenga en cuenta que esto incluso se aplica a mecanismos más antiguos, como el uso de métodos de devolución de llamada en C para el manejo de eventos. Es el mismo intento, simplemente implementado de manera ligeramente diferente.

6

De MSDN

Aquellos de ustedes con la familiaridad que pasa de los tipos expuestos en el FCL se nota que ningún IObserver, IObservable, o ObservableImpl tipos están presentes en el Marco . La razón principal de su ausencia es el hecho de que el CLR los hace obsoletos después de una moda. Aunque ciertamente puede utilizar estas construcciones en una aplicación .NET, el introducción de delegados y eventos proporciona un nuevo y poderoso medio de ejecución del patrón Observer sin desarrollar tipos específicos dedicadas a apoyar este patrón. En el hecho , como delegados y eventos son miembros de primera clase de la CLR, la base de este patrón es incorporada en el núcleo del .NET Framework. Como tal, la FCL hace uso extensivo del patrón Observer en toda su estructura.

+0

Buena teoría. Lástima que omitieron algunos detalles importantes (como que el editor del evento le dé al suscriptor un token que puede utilizar para darse de baja, o que tenga un medio por el cual el editor puede preguntar a los suscriptores si todavía están "interesados" en sus suscripciones). Es decir, si se crean y abandonan muchas instancias de un objeto que se adhiere al evento 'Disposed' de un objeto de larga vida, no hay medios para que esas suscripciones se limpien durante la vida del objeto de larga duración. eventos secundarios débiles, no habría forma de que el editor del evento .... – supercat

+0

... para saber cuándo su objetivo salió fuera del alcance. El lado débil del sector editorial podría ser un poco mejor, pero solo es eficiente si el cliente está requerido para mantener una fuerte referencia a su propio delegado (que no es un requisito habitual para los eventos). – supercat

Cuestiones relacionadas