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?
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?
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 leve P
que, por sua vez, gerencia X
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.
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 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 Source
objeto e, nos bastidores, chamar o Target
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.