Tenho lido o Gang Of Four , a fim de resolver alguns dos meus problemas e me deparei com o padrão Mediator .
Eu já havia usado o Observer em meus projetos para fazer alguns aplicativos GUI. Estou um pouco confuso porque não encontro grande diferença entre os dois. Procurei encontrar a diferença, mas não consegui encontrar uma resposta adequada para minha consulta.
Alguém poderia me ajudar a diferenciar os dois com algum bom exemplo que claramente demarque os dois?
Programmers.StackExchange
foi negado, mas fiz uma postagem semelhante porque estava interessado na resposta. Você pode achar algumas das respostas interessantes. :)ChangeManager
para oObserver
padrão que usaMediator
. Vejo; paginas.fe.up.pt/~aaguiar/as/gof/hires/pat5g.htm#samplecodeRespostas:
O padrão Observer: define uma dependência um-para-muitos entre objetos para que, quando um objeto muda de estado, todos os seus dependentes são notificados e atualizados automaticamente.
O padrão Mediator: define um objeto que encapsula como um conjunto de objetos interage. O mediador promove o acoplamento fraco, evitando que os objetos se refiram explicitamente uns aos outros e permite que você varie sua interação independentemente.
Fonte: dofactory
Exemplo:
O padrão do observador: Classe A, pode ter zero ou mais observadores do tipo O registrados nele. Quando algo em A é alterado, ele notifica todos os observadores.
O padrão do mediador: você tem algumas instâncias da classe X (ou talvez até vários tipos diferentes: X, Y e Z) e eles desejam se comunicar (mas você não quer que cada um tenha referências explícitas a cada um outro), então você cria uma classe de mediador M. Cada instância de X tem uma referência a uma instância compartilhada de M, por meio da qual pode se comunicar com as outras instâncias de X (ou X, Y e Z).
fonte
No livro original que cunhou os termos Observador e Mediador, Padrões de Design, Elementos de Software Orientado a Objetos Reutilizáveis , ele diz que o padrão Mediador pode ser implementado usando o padrão observador. No entanto, também pode ser implementado fazendo com que os Colegas (que são aproximadamente equivalentes ao padrão Assuntos do Observador) tenham uma referência a uma classe Mediador ou a uma interface Mediador.
Existem muitos casos em que você gostaria de usar o padrão de observador, a chave é que um objeto não deve saber quais outros objetos estão observando seu estado.
O mediador é um pouco mais específico, evita que as classes se comuniquem diretamente, mas por meio de um mediador. Isso ajuda o princípio de Responsabilidade Única, permitindo que a comunicação seja transferida para uma classe que apenas lida com a comunicação.
Um exemplo clássico do Mediador é em uma GUI, onde a abordagem ingênua pode levar a um código em um evento de clique de botão dizendo "se o painel Foo estiver desabilitado e o painel Bar tiver um rótulo dizendo" Por favor, digite a data "e não chame o servidor, caso contrário, vá em frente ", onde com o padrão Mediator poderia dizer" Sou apenas um botão e não tenho nada a ver com o painel Foo e a etiqueta no painel Bar, então vou perguntar ao meu mediador se ligar para o servidor está OK agora. "
Ou, se o Mediator for implementado usando o padrão Observer, o botão dirá "Ei, observadores (o que incluiria o mediador), meu estado mudou (alguém clicou em mim). Faça algo a respeito, se quiser". No meu exemplo, isso provavelmente faz menos sentido do que referenciar diretamente o mediador, mas em muitos casos, usar o padrão Observer para implementar o Mediator faria sentido, e a diferença entre o Observer e o Mediator seria mais uma intenção do que uma diferença no próprio código.
fonte
Observador
1. Sem
Cliente1 : Ei , sujeito , quando você muda?
Cliente2 : Quando você mudou de assunto ? Eu não percebi!
Cliente3 : Eu sei que o assunto mudou.
2. Com
Mediador
1. Sem
2. Com
fonte
Esses padrões são usados em diferentes situações:
O padrão de mediador é usado quando você tem dois subsistemas com alguma dependência e um deles deve ser alterado, e como você pode não querer mudar o sistema que depende do outro, você pode introduzir um mediador que irá desacoplar a dependência entre eles. Dessa forma, quando um dos subsistemas muda, tudo que você precisa fazer é atualizar o mediador.
O padrão observador é usado quando uma classe deseja permitir que outras classes se registrem e recebam notificações sobre eventos, por exemplo, ButtonListener etc.
Ambos os padrões permitem menor acoplamento, mas são bastante diferentes.
fonte
Vamos por um exemplo: considere que você deseja construir dois aplicativos:
mediador
Ao construir o aplicativo de chat, você escolherá o
mediator
padrão de design.Por que vamos preferir o
mediator
? basta dar uma olhada em sua definição:Como funciona a magia? Primeiro iremos criar o mediador de chat e fazer com que os objetos de pessoas se registrem nele, então ele terá duas conexões direcionais com cada pessoa (a pessoa pode enviar mensagem usando o mediador de chat porque tem acesso a ele, e o mediador de chat irá acessar o método recebido do objeto pessoa porque ele também tem acesso a ele)
observador
Ao construir o aplicativo de chamada para o 911, você escolherá o
observer
padrão de design.observer
objeto deseja ser informado quando houver um estado de emergência, para que ele possa dirigir até o endereço e dar ajuda.observable
mantém referência a cada um da ambulânciaobservers
e os notifica quando ajuda é necessária (ou evento gerador).Por que vamos preferir o
observer
? basta dar uma olhada em sua definição:As diferenças:
mediator
tem comunicação bidireccional entre os objectos da pessoa (enviar e receber), enquanto o operadorobservable
tem comunicação apenas unilateral (avisa a ambulânciaobserver
para conduzir e terminar).mediator
pode fazer com que os objetos das pessoas interajam entre si (mesmo que não seja uma comunicação direta), as ambulânciasobservers
só se cadastram nosobservable
eventos da operadora .mediator
, e também o chatmediator
guarda referência a cada uma das pessoas. Quando a ambulânciaobserver
não mantém referência ao operadorobservable
, apenas o operadorobservable
mantém referência a todas as ambulânciasobserver
.fonte
Embora ambos sejam usados para uma maneira organizada de falar sobre mudanças de estado, eles são ligeiramente diferentes estrutural e semanticamente da OMI.
Observer é usado para transmitir uma mudança de estado de um objeto específico, a partir do próprio objeto. Assim, a mudança ocorre no objeto central que também é responsável por sinalizá-lo. No entanto, no Mediator, a mudança de estado pode acontecer em qualquer objeto, mas é transmitida de um mediador. Portanto, há uma diferença no fluxo. Mas não acho que isso afete nosso comportamento de código. Podemos usar um ou outro para obter o mesmo comportamento. Por outro lado, essa diferença pode afetar a compreensão conceitual do código.
Veja, o objetivo principal de usar padrões é antes criar uma linguagem comum entre os desenvolvedores. Então, quando vejo um mediador, eu pessoalmente entendo vários elementos tentando se comunicar por meio de um único broker / hub para reduzir o ruído de comunicação (ou para promover SRP) e cada objeto é igualmente importante em termos de ter a capacidade de sinalizar uma mudança de estado. Por exemplo, pense em várias aeronaves se aproximando de um aeroporto. Cada um deve se comunicar pelo pilão (mediador) em vez de se comunicarem uns com os outros. (Pense em 1000 aeronaves comunicando-se entre si durante o pouso - seria uma bagunça)
No entanto, quando vejo um observador, significa que há algumas mudanças de estado com as quais posso me preocupar e devo registrar / assinar para ouvir mudanças de estado específicas. Existe um objeto central responsável por sinalizar mudanças de estado. Por exemplo, se eu me importo com um aeroporto específico no caminho de A para B, posso me registrar nesse aeroporto para assistir a alguns eventos transmitidos como se houvesse uma pista vazia ou algo parecido.
Espero que esteja claro.
fonte
@cdc explicou a diferença de intenção de maneira excelente.
Vou adicionar mais algumas informações sobre ele.
Observador : Habilita a notificação de um evento em um objeto para diferentes conjuntos de objetos (instâncias de diferentes classes)
Mediador : Centraliza a comunicação entre conjunto de objetos, criados a partir de uma determinada classe.
Estrutura do padrão de mediador da dofactory :
Mediador : Define uma interface para comunicação entre Colegas.
Colega : É uma classe abstrata, que define os eventos a serem comunicados entre Colegas
ConcreteMediator : Implementa comportamento cooperativo coordenando objetos Colleague e mantém seus colegas
ConcreteColleague : Implementa as operações de notificação recebidas por meio do Mediador , que foram geradas por outro Colega
Um exemplo do mundo real:
Você está mantendo uma rede de computadores no Mesh topologia . Se um novo computador for adicionado ou um computador existente for removido, todos os outros computadores dessa rede devem saber sobre esses dois eventos.
Vamos ver como o padrão do mediador se encaixa nele.
Fragmento de código:
resultado:
Explicação:
fonte
Como Sobre esta explicação Tecnicamente, tanto o Observer quanto o Mediator são iguais e são usados para fornecer uma maneira desacoplada para a comunicação do componente, mas o uso é diferente.
Enquanto
obeserver
notifica os componentes assinados sobre mudanças de estado (criação de novo registro db, por exemplo), osmediator
comandos registrados componentes para fazer algo relacionado ao fluxo de lógica de negócios (enviar email ao usuário para redefinição de senha).Observador
Mediador
fonte