strategy patterns pattern gof dofactory book c# .net design-patterns

c# - dofactory - gof design patterns



En C#, ¿no es el patrón del observador ya implementado usando Eventos? (8)

Así es, los eventos son una implementación del patrón del observador. Sin embargo, he leído discusiones de personas que todavía escriben las suyas, para darles más flexibilidad o, simplemente, para evitar la sintaxis de la generación de eventos.

Después de leer el libro de Patrones de Diseño de Head First y de utilizar otros patrones de diseño, intento comprender el patrón Observer. ¿No es esto ya implementado usando Eventos en .NET Framework?


La mayoría de los idiomas modernos tienen soporte nativo para algunos de los patrones de diseño. Se ha argumentado que los idiomas son mejores cuanto más patrones soportan de forma nativa sin la necesidad de implementarlos explícitamente, y que Lisp es excelente en este sentido. Jeff también tenía algo que decir al respecto.


No, logran el mismo intento, sin embargo son diferentes. Yo diría que el patrón Observer es un hack over del diseño para lograr algo que podría haber logrado fácilmente con la programación funcional, y que los eventos .NET usan programación funcional para lograr el mismo objetivo.


Sí lo es. El patrón de observador también se llama patrón de publicación / suscripción, que es exactamente lo que los eventos le permiten hacer.


Sí, es idéntico.

Una nota: si realmente quieres comprender los eventos, te recomiendo que aprendas el patrón del observador y lo implementes por un tiempo. Una vez que lo comprende completamente, deje de hacerlo usted mismo y utilice la implementación profesional y bien documentada a menos que tenga una necesidad real de hacerlo de otra manera.


Sí, pero programar el patrón del observador de forma explícita y, por lo tanto, no usar delegados y eventos puede resultar en una depuración más fácil de su código.

Considera la diferencia:

public void NotifyObservers() { foreach(Product product in ProductList) { if (product is IProductObserver) { product.Update(this) } } }

Aquí está muy claro qué productos de la lista reciben notificación de un cambio. Durante la depuración, puede inspeccionar ProductList ...

Con el uso de delegados y eventos puede ser más engorroso averiguar cuántos "delegados" se "suscribieron" para manejar el evento.


Yo diría que sí, que fue la intención de Anders Heljsberg hacer que el patrón del observador fuera una característica del lenguaje de primera clase con eventos en C #, en base a su experiencia con Delphi. Anders aclara esta y otras intenciones de diseño en una excelente entrevista en Software Engineering Radio .


Microsoft mismo declara que el uso de eventos y delegados es la forma c # de aplicar el patrón de observador. Utilizando algunas convenciones de nomenclatura básicas para eventos y delegados, nombraron su propio patrón como "Patrón de Evento", que hace exactamente lo mismo y proporciona algunas ventajas adicionales sobre el Patrón Observer clásico.

El "Patrón de evento" se describe en la Biblioteca de MSDN dentro del artículo " Explorando el patrón de diseño del observador ".

Referencia del artículo de MSDN

En función de los eventos y los delegados, la FCL usa el patrón Observer de manera bastante extensa. Los diseñadores de la FCL se dieron cuenta completamente del poder inherente de este patrón, aplicándolo tanto a la interfaz de usuario como a las características no relacionadas con la IU en todo el Marco. Este uso, sin embargo, es una pequeña variación en el patrón de Observador base, que el equipo del Marco ha denominado Patrón de Evento. En general, este patrón se expresa como convenciones formales de nomenclatura para delegados, eventos y métodos relacionados que participan en el proceso de notificación de eventos. Microsoft recomienda que todas las aplicaciones y frameworks que utilizan eventos y delegados adopten este patrón, aunque no hay aplicación en el CLR o el compilador estándar.

Basado en este examen del patrón Observer, debería ser evidente que este patrón proporciona un mecanismo ideal para asegurar límites nítidos entre objetos en una aplicación, independientemente de su función (UI o de otro tipo). Aunque es bastante simple de implementar a través de devoluciones de llamada (utilizando las interfaces IObserver e IObservable), los conceptos CLR de delegados y eventos manejan la mayoría de los "trabajos pesados", así como también disminuyen el nivel de acoplamiento entre el sujeto y el observador.