He estado leyendo Gang Of Four para resolver algunos de mis problemas y encontré el patrón Mediator .
Anteriormente había usado Observer en mis proyectos para hacer alguna aplicación GUI. Estoy un poco confundido porque no encuentro gran diferencia entre los dos. Busqué para encontrar la diferencia pero no pude encontrar ninguna respuesta adecuada para mi consulta.
¿Podría alguien ayudarme a diferenciar entre los dos con algún buen ejemplo que los demarque claramente?
Programmers.StackExchange
fue denegada, pero hice una publicación similar allí porque estaba interesado en la respuesta. Puede que algunas de las respuestas te resulten interesantes. :)ChangeManager
para elObserver
patrón que usosMediator
. ver; paginas.fe.up.pt/~aaguiar/as/gof/hires/pat5g.htm#samplecodeRespuestas:
El patrón de observador: define una dependencia de uno a muchos entre objetos para que cuando un objeto cambie de estado, todos sus dependientes sean notificados y actualizados automáticamente.
El patrón del mediador: define un objeto que encapsula cómo interactúa un conjunto de objetos. Mediator promueve el acoplamiento flexible al evitar que los objetos se refieran entre sí de forma explícita y le permite variar su interacción de forma independiente.
Fuente: dofactory
Ejemplo:
El patrón de observadores: Clase A, puede tener cero o más observadores de tipo O registrados. Cuando se cambia algo en A, notifica a todos los observadores.
El patrón del mediador: tienes algunas instancias de clase X (o tal vez incluso varios tipos diferentes: X, Y y Z), y desean comunicarse entre sí (pero no quieres que cada una tenga referencias explícitas a cada una). otro), por lo que crea una clase mediadora M. Cada instancia de X tiene una referencia a una instancia compartida de M, a través de la cual puede comunicarse con las otras instancias de X (o X, Y y Z).
fuente
En el libro original que acuñó los términos Observador y Mediador, Patrones de diseño, Elementos de software orientado a objetos reutilizable , se dice que el patrón Mediador se puede implementar utilizando el patrón de observador. Sin embargo, también se puede implementar haciendo que los colegas (que son aproximadamente equivalentes al patrón de sujetos del observador) tengan una referencia a una clase de mediador o una interfaz de mediador.
Hay muchos casos en los que desea utilizar el patrón de observador, la clave es que un objeto no debe saber qué otros objetos están observando su estado.
El mediador es un poco más específico, evita que las clases se comuniquen directamente, sino a través de un mediador. Esto ayuda al principio de Responsabilidad Única al permitir que la comunicación se descargue a una clase que solo maneja la comunicación.
Un ejemplo clásico de Mediator está en una GUI, donde el enfoque ingenuo puede llevar a un código en un evento de clic de botón que dice "si el panel Foo está deshabilitado y el panel de la barra tiene una etiqueta que dice" Ingrese la fecha ", entonces no llame al servidor, de lo contrario, adelante ", donde con el patrón de Mediador podría decir" Soy solo un botón y no tengo nada que ver con conocer el panel de Foo y la etiqueta en el panel de la barra, así que solo le preguntaré a mi mediador si llama al servidor está bien ahora ".
O, si Mediator se implementa usando el patrón Observer, el botón diría "Hey, observadores (que incluiría al mediador), mi estado cambió (alguien hizo clic en mí). Haga algo al respecto si le importa". En mi ejemplo, eso probablemente tiene menos sentido que hacer referencia directa al mediador, pero en muchos casos usar el patrón Observer para implementar Mediator tendría sentido, y la diferencia entre Observer y Mediator sería más una de intención que una diferencia en el código mismo.
fuente
Observador
1. Sin
Cliente1 : Oye Asunto , ¿cuándo cambias?
Cliente2 : ¿Cuándo cambió de Asunto ? ¡No me he dado cuenta!
Cliente3 : Sé que el Asunto ha cambiado.
2. Con
Mediador
1. Sin
2. Con
fuente
Estos patrones se utilizan en diferentes situaciones:
El patrón de mediador se utiliza cuando tiene dos subsistemas con alguna dependencia y uno de ellos debe cambiar, y dado que es posible que no desee cambiar el sistema que depende del otro, es posible que desee introducir un mediador que desacoplar la dependencia entre ellos. De esa manera, cuando uno de los subsistemas cambia, todo lo que tiene que hacer es actualizar el mediador.
El patrón de observador se usa cuando una clase quiere permitir que otras clases se registren y reciban notificaciones sobre eventos, por ejemplo, ButtonListener, etc.
Ambos patrones permiten un acoplamiento menor, pero son bastante diferentes.
fuente
Veamos un ejemplo: considere que desea construir dos aplicaciones:
mediador
Al construir la aplicación de chat, elegirá el
mediator
patrón de diseño.¿Por qué preferiremos el
mediator
? solo eche un vistazo a su definición:¿Cómo funciona la magia? Primero crearemos el mediador de chat y haremos que los objetos de las personas se registren en él, por lo que tendrá una conexión bidireccional con cada persona (la persona puede enviar un mensaje usando el mediador de chat porque tiene acceso a él y el mediador de chat accederá el método recibido de la persona objeto porque él también tiene acceso a él)
observador
Al crear la aplicación de llamada al 911, elegirá el
observer
patrón de diseño.observer
objeto de la ambulancia desea ser informado cuando hay un estado de emergencia, para poder conducir la dirección y brindar ayuda.observable
mantiene la referencia a cada una de las ambulanciasobservers
y les notifica cuando se necesita ayuda (o evento generador).¿Por qué preferiremos el
observer
? solo eche un vistazo a su definición:Las diferencias:
mediator
tiene comunicación bidireccional entre los objetos de las personas (enviar y recibir) donde el operadorobservable
solo tiene comunicación unidireccional (le dice a la ambulanciaobserver
que conduzca y termine).mediator
puede hacer que los objetos de las personas interactúen entre ellos (incluso si no es una comunicación directa), las ambulanciasobservers
solo se registran en losobservable
eventos del operador .mediator
, y también el chatmediator
mantiene una referencia a cada una de las personas. Donde la ambulanciaobserver
no mantiene la referencia al operadorobservable
, solo el operadorobservable
mantiene la referencia a cada ambulanciaobserver
.fuente
Aunque ambos se utilizan para una forma organizada de informar sobre los cambios de estado, en mi opinión son ligeramente diferentes estructural y semánticamente.
El observador se utiliza para transmitir un cambio de estado de un objeto en particular, desde el propio objeto. Entonces el cambio ocurre en el objeto central que también se encarga de señalizarlo. Sin embargo, en Mediator, el cambio de estado puede ocurrir en cualquier objeto, pero se transmite desde un mediador. Entonces hay una diferencia en el flujo. Pero no creo que esto afecte el comportamiento de nuestro código. Podemos utilizar uno u otro para lograr el mismo comportamiento. Por otro lado, esta diferencia podría tener algunos efectos en la comprensión conceptual del código.
Vea, el propósito principal de usar patrones es más bien crear un lenguaje común entre desarrolladores. Entonces, cuando veo a un mediador, personalmente entiendo múltiples elementos que intentan comunicarse a través de un solo corredor / concentrador para reducir el ruido de la comunicación (o promover SRP) y cada objeto es igualmente importante en términos de tener la capacidad de señalar un cambio de estado. Por ejemplo, piense en varias aeronaves que se acercan a un aeropuerto. Cada uno debe comunicarse a través del pilón (mediador) en lugar de comunicarse entre sí. (Piense en 1000 aviones que se comunican entre sí al aterrizar, eso sería un desastre)
Sin embargo, cuando veo a un observador, significa que hay algunos cambios de estado que podrían interesarme y debería registrarme / suscribirme para escuchar cambios de estado particulares. Hay un objeto central responsable de señalar los cambios de estado. Por ejemplo, si me preocupa un aeropuerto específico en mi camino de A a B, puedo registrarme en ese aeropuerto para ver algunos eventos transmitidos, como si hubiera una pista vacía o algo así.
Espero que esté claro.
fuente
@cdc explicó la diferencia de intenciones de manera excelente.
Agregaré más información encima.
Observador : permite la notificación de un evento en un objeto a diferentes conjuntos de objetos (instancias de diferentes clases)
Mediador : Centraliza la comunicación entre un conjunto de objetos, creado a partir de una clase en particular.
Estructura del patrón de Mediador de dofactory :
Mediador : define una interfaz para la comunicación entre colegas.
Colega : Es una clase abstracta, que define los eventos que se comunicarán entre Colegas.
ConcreteMediator : implementa el comportamiento cooperativo coordinando objetos de colega y mantiene a sus colegas
ConcreteColleague : Implementa las operaciones de notificación recibidas a través de Mediator , que ha sido generada por otro Colega
Un ejemplo del mundo real:
Mantienes una red de computadoras en Mesh topología de . Si se agrega una computadora nueva o se quita una computadora existente, todas las demás computadoras en esa red deben conocer estos dos eventos.
Veamos cómo encaja el patrón Mediator.
Fragmento de código:
salida:
Explicación:
fuente
¿Qué tal esta explicación? Técnicamente, tanto Observer como Mediator son iguales y se utilizan para proporcionar una vía desacoplada para la comunicación de componentes, pero el uso es diferente.
Si bien
obeserver
notifica a los componentes suscritos sobre los cambios de estado (creación de un nuevo registro de base de datos, por ejemplo), losmediator
comandos registrados componentes para hacer algo relacionado con el flujo de la lógica empresarial (enviar un correo electrónico al usuario para restablecer la contraseña).Observador
Mediador
fuente