Alguém pode me fornecer uma resposta canônica sobre as diferenças entre um Observer
e um Mediator
e um resumo de quando você deve usar um padrão sobre o outro?
Não tenho certeza de que tipo de situação exigiria Observer
e que tipo exigiria umaMediator
design-patterns
Rachel
fonte
fonte
Respostas:
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 do Mediador pode ser implementado usando o padrão do observador. No entanto, também pode ser implementado fazendo com que os Colegas (aproximadamente equivalentes ao padrão Assuntos do Observador) tenham uma referência a uma classe de Mediador ou a uma interface de Mediador.
Existem muitos casos em que você deseja usar o padrão observador, o principal é que o 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 através 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 isso.
Um exemplo clássico do Mediador está em uma GUI, em que a abordagem ingênua pode levar ao código em um evento de clique no botão dizendo "se o painel Foo estiver desativado e o painel Bar tiver um rótulo dizendo" Digite a data ", não ligue para o servidor, caso contrário, vá em frente ", onde, com o padrão Mediador, ele poderia dizer" Eu sou apenas um botão e não tenho negócios terrestres sabendo sobre o painel Foo e a etiqueta no painel Bar, então, perguntarei ao meu mediador se ligar para o servidor. está bem agora. "
Ou, se for implementado usando o padrão de observador, o botão dirá "Ei, observadores (que incluiria o mediador), meu estado mudou (alguém clicou em mim). Faça algo sobre isso, se você se importa". No meu exemplo, isso provavelmente faz menos sentido, mas às vezes faria, e a diferença entre Observer e Mediador seria mais uma intenção do que uma diferença no próprio código.
fonte
O padrão Observador funciona bem quando não é necessária nenhuma coordenação entre os observadores e o relacionamento dos observadores segue um caminho.
Por exemplo, permita que os objetos B e C observem o objeto A. Quando o objeto A dispara o evento X, o objeto B deve executar o método Y () e o objeto C deve executar o método Z (). Se os métodos BY () e CZ () forem totalmente independentes e não exigirem coordenação, vá em frente e use o padrão observador.
Por outro lado, se BY () precisar ser executado antes de CZ (), você desejará usar o padrão Mediador em que o mediador encapsula essa coordenação. Nesse cenário, o mediador M observaria o objeto A e teria referências aos objetos B e C. Quando A dispara o evento X, M manipula o evento e chama BY () e CZ () na ordem prescrita.
Além disso, se os objetos A, B e C precisarem se observar, o uso de um mediador como intermediário ajudará bastante a desacoplar esses objetos e evitar o código de espaguete.
fonte
O
Observer
padrão é usado quando uma ação executada em uma classe (a classe observada) precisa produzir uma reação em outra classe (a classe observadora), mas é indesejável que a classe observada seja acoplada à classe observadora. Este é um padrão muito comum. O analisador XML SAX pode ser um bom exemplo. Para usar o analisador SAX, um cliente implementa aContentHandler
interface para "observar" a operação do analisador. À medida que o analisador encontra elementos do documento XML, ele chama métodos deContentHandler
. O analisador pode chamar o código do cliente, mas o analisador não está acoplado ao código do cliente.O
Mediator
padrão é um encapsulamento de um padrão de uso de um conjunto de objetos. O código do cliente é acoplado apenas ao mediador, em vez de ser acoplado a várias outras classes. É semelhante à agregação, exceto que a vida útil dos objetos encapsulados é independente da vida útil do mediador.fonte
Em termos simples (que eu uso para lembrar):
Observador: Use quando um objeto quiser ser informado sobre alterações de estado em outro (a rigor, usar eventos é Observador)
Para entender o mediador, acho mais fácil quando você considera o Facade primeiro: o Facade agrega a funcionalidade de classes separadas (às vezes subsistemas inteiros) e fornece essa funcionalidade em uma única interface.
Mediador: O mesmo que Fachada, exceto que combina a funcionalidade de todas as classes agregadas para produzir nova funcionalidade. (Boa explicação aqui )
fonte