Mediador vs Observador?

27

Alguém pode me fornecer uma resposta canônica sobre as diferenças entre um Observere um Mediatore um resumo de quando você deve usar um padrão sobre o outro?

Não tenho certeza de que tipo de situação exigiria Observere que tipo exigiria umaMediator

Rachel
fonte
Gostaria de saber sua própria idéia sobre isso depois de 7 anos?
Niing 01/04

Respostas:

19

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.

psr
fonte
Obrigado, seus exemplos realmente ajudaram a esclarecer as diferenças entre os dois para mim. Se bem entendi, o padrão de observador usa um sistema de assinatura / transmissão de mensagens para comunicação, enquanto o mediador é como uma entidade globalmente acessível cujos objetos podem consultar informações.
24512 Rachel Rachel
@ Rachel - eu descreveria o observador como você fez. O mediador provavelmente não é global, mas é conhecido por todos os objetos no conjunto que estariam se comunicando, mas agora passam pelo mediador. A menos que o mediador seja implementado como um observador, nesse caso, ele conhece todos esses objetos (pelo menos por meio de sua interface observável, talvez diretamente), mas eles não sabem disso.
psr
9

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.

Raymond Saltrelli
fonte
5

O Observerpadrã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 a ContentHandlerinterface para "observar" a operação do analisador. À medida que o analisador encontra elementos do documento XML, ele chama métodos de ContentHandler. O analisador pode chamar o código do cliente, mas o analisador não está acoplado ao código do cliente.

O Mediatorpadrã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.

Kevin Cline
fonte
1

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 )

Steven Evers
fonte