@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.
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 lá 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.
Respostas:
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,
X
você faz cópias de um proxy leveP
que, por sua vez, gerenciaX
e 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.
fonte
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
Source
gostaria de chamar um método para outro objetoTarget
, mas a interface desse outro objeto difere do que o cliente está esperando.Digite o objeto do adaptador.
Pode receber uma chamada do
Source
objeto e, nos bastidores, chamar oTarget
mé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.
fonte