Diferença entre os padrões de design de Fachada, Proxy, Adaptador e Decorador? [fechadas]

135

Qual é a diferença entre os padrões de design de Fachada, Proxy, Adaptador e Decorador?

Eu nunca li uma explicação clara, qual é a sua?

user310291
fonte
@gavenkoa a outra questão é apenas cerca de proxy e decorador
user310291
2
Por incrível que pareça, algumas perguntas fechadas se revelam tão úteis.
Lucas

Respostas:

285

O adaptador adapta uma determinada classe / objeto a uma nova interface. No caso do primeiro, a herança múltipla é normalmente empregada. No último caso, o objeto é envolvido por um objeto adaptador em conformidade e transmitido. O problema que estamos resolvendo aqui é o de interfaces não compatíveis .

Fachada é mais como um gateway simples para um conjunto complicado de funcionalidades. Você cria uma caixa preta para que seus clientes se preocupem menos, ou seja , simplifica as interfaces .

O proxy fornece a mesma interface que a classe com proxy e normalmente faz algumas tarefas de limpeza por conta própria. (Portanto, em vez de fazer várias cópias de um objeto pesado, Xvocê faz cópias de um proxy leve Pque, por sua vez, gerencia Xe traduz suas chamadas conforme necessário.) Você está resolvendo o problema do cliente de precisar gerenciar um objeto pesado e / ou complexo .

O Decorator é usado para adicionar mais pólvora aos seus objetos (observe o termo objetos - você normalmente decora objetos dinamicamente em tempo de execução). Você não oculta / prejudica as interfaces existentes do objeto, mas simplesmente o estende em tempo de execução .

Agora que você tem o decorador envolvido, provavelmente desejará saber por que a ênfase na palavra objeto - algumas linguagens (como Java) simplesmente não permitem herança virtual (por exemplo, herança múltipla como o C ++) para permitir que você faça isso em tempo de compilação.

Como arrastamos várias heranças (e o temido diamante), você procurará mixins - que são ordenados encadeamento linear de interfaces para contornar os problemas da herança múltipla. No entanto, mixins não se misturam tão bem. E terminamos com características - sim, aquelas pequenas bolhas de comportamento sem estado que você vê o tempo todo aparecendo nos parâmetros do modelo em C ++. Os traços tentam abordar as questões de composição e decomposição de comportamento de maneira elegante, ao mesmo tempo em que não buscam múltiplas heranças ou encadeamento ordenado.

dirkgently
fonte
1
HTH! Tentei colocar o máximo que pude sem ser muito vago. Desculpe minha incapacidade de fazer melhor. Eu li (dissertação de doutorado) trabalhos apenas sobre traços. Meu conhecimento, portanto, é bastante limitado e não é bom o suficiente para caber em todos os padrões neste espaço;)
dirkgently
Você antecipou uma pergunta futura sobre mixins e características, mas eu ainda não as vi!
user310291
1
Um bom link de comparação (via wikipedia) para os três primeiros (o Decorator é bem diferente): NetObjectives
Liviu
@Liviu Seu link está morto. Suponho que você estava apontando para originalmente , mas o conteúdo agora parece estar atrás de um login.
Jonathan H
@Sheljohn Link updated: p: Um bom link de comparação (via wikipedia) para os três primeiros (o Decorator é bem diferente) NetObjectives (texto de recuperação , consulte "betweem": "Uma das perguntas mais frequentes que recebo na aula é" o que é a diferença entre Adaptador, Proxy e Fachada? Eles realmente parecem iguais para mim ".)
Liviu
16

Fachada

Você pode usar uma fachada, por exemplo, para facilitar as chamadas para uma API. Veja este exemplo de fachada remota. A idéia aqui é que a implementação completa do código no servidor esteja oculta do cliente. O cliente chama 1 método de API que, por sua vez, pode fazer 1 ou mais chamadas de API no servidor.

Adaptador

Um bom exemplo disso pode ser encontrado aqui , na Wikipedia. Um objeto cliente Sourcegostaria de chamar um método para outro objeto Target, mas a interface desse outro objeto difere do que o cliente está esperando.

Digite o objeto do adaptador.

Pode receber uma chamada do Sourceobjeto e, nos bastidores, chamar o Targetmétodo que deve ser usado.

Source->CallMethodAOnTarget() ---< Adaptor.CallMethodAOnTarget() this calls ---> Target.MethodWithDifferentSignatureAndName(int i)

Quanto ao Proxy, não tenho nenhuma experiência com esse padrão de design.

Jason Evans
fonte