Qual é a diferença entre os padrões Bridge e Adapter?
design-patterns
adapter
bridge
Firoz
fonte
fonte
Respostas:
Efetivamente, o padrão do Adaptador é útil quando você possui código existente, seja de terceiros ou interno, mas fora do seu controle ou não é mutável para atender perfeitamente à interface que você precisa. Por exemplo, temos um SuperWeaponsArray que pode controlar uma boa variedade de dispositivos do dia do juízo final.
Ótimo. Exceto que percebemos que temos um dispositivo nuclear em nosso arsenal que antecede amplamente a conversão para a interface de armas. Mas nós realmente gostaríamos que funcionasse aqui ... então o que fazemos?
NukeWeaponsAdaptor - baseado em nossa classe Nuke, mas exportando a interface Arma. Doce, agora podemos certamente destruir o mundo. Parece um pouco de confusão, mas faz as coisas funcionarem.
O padrão Bridge é algo que você implementa antecipadamente - se você sabe que possui duas hierarquias ortogonais, ele fornece uma maneira de dissociar a interface e a implementação de tal maneira que você não obtém um número insano de classes. Digamos que você tenha:
Tipos de objetos de arquivo MemoryMappedFile e DirectReadFile. Digamos que você queira ler arquivos de várias fontes (talvez implementações Linux vs. Windows, etc.). O Bridge ajuda a evitar que você acabe com:
MemoryMappedWindowsFile MemoryMappedLinuxFile DirectReadWindowsFile DirectReadLinuxFile
fonte
http://en.wikipedia.org/wiki/Adapter_pattern
O padrão do adaptador é mais sobre como fazer com que seu código existente funcione com um sistema ou interface mais recente.
Se você possui um conjunto de APIs de serviço da web padrão da empresa que gostaria de oferecer à interface de extensibilidade existente de outro aplicativo, considere escrever um conjunto de adaptadores para fazer isso. Observe que há uma área cinza e isso é mais sobre como você define tecnicamente o padrão, pois outros padrões como a fachada são semelhantes.
http://en.wikipedia.org/wiki/Bridge_pattern
O padrão Bridge permitirá que você possua implementações alternativas de um algoritmo ou sistema.
Embora não seja um exemplo clássico de padrão de ponte, imagine se você tivesse algumas implementações de um armazenamento de dados: uma é eficiente no espaço, a outra é eficiente no desempenho bruto ... e você tem um caso de negócios para oferecer tanto no aplicativo quanto na estrutura .
Em termos de sua pergunta, "onde posso usar qual padrão", a resposta é: onde quer que faça sentido para o seu projeto! Talvez considere oferecer uma edição de esclarecimentos para orientar a discussão sobre onde você acredita que precisa usar um ou outro.
fonte
Adaptador:
Diagrama UML: do artigo dofactory :
Alvo : define a interface específica do domínio que o Cliente usa.
Adaptador : adapta a interface Adaptado à interface de destino.
Adaptado : define uma interface existente que precisa ser adaptada .
Cliente : colabora com objetos em conformidade com a interface Target.
Exemplo:
Quadrado e Retângulo são duas formas diferentes e a área de obtenção () de cada uma delas exige métodos diferentes. Mas ainda assim o Square trabalha na interface Retangular com a conversão de algumas das propriedades.
Ponte:
EDIT: (conforme sugestão @quasoft)
Você tem quatro componentes neste padrão.
Abstração : define uma interface
RefinedAbstraction : Implementa abstração:
Implementador : define uma interface para implementação
ConcreteImplementor : Implementa a interface do implementador.
Fragmento de código:
Post relacionado:
Quando você usa o padrão de ponte? Como é diferente do padrão do adaptador?
Principais diferenças: do artigo de criação de código - fonte
fonte
Este post já existe há algum tempo. No entanto, é importante entender que uma fachada é um pouco semelhante a um adaptador, mas não é exatamente a mesma coisa. Um adaptador "adapta" uma classe existente a uma classe cliente geralmente não compatível. Digamos que você tenha um sistema de fluxo de trabalho antigo que seu aplicativo está usando como cliente. Sua empresa poderia substituir o sistema de fluxo de trabalho por um novo "incompatível" (em termos de interfaces). Na maioria dos casos, você pode usar o padrão do adaptador e escrever um código que realmente chama as interfaces do novo mecanismo de fluxo de trabalho. Uma ponte é geralmente usada de uma maneira diferente. Se você realmente possui um sistema que precisa trabalhar com sistemas de arquivos diferentes (por exemplo, disco local, NFS etc.), pode usar o padrão de ponte e criar uma camada de abstração para trabalhar com todos os seus sistemas de arquivos. Basicamente, esse seria um caso de uso simples para o padrão de ponte. A Fachada e o adaptador compartilham algumas propriedades, masfachadas são geralmente usadas para simplificar uma interface / classe existente . Nos primeiros dias dos EJBs, não havia chamadas locais para EJBs. Os desenvolvedores sempre obtinham o esboço, o reduziam e o chamavam de "pseudo-remotamente". Isso muitas vezes causava problemas de desempenho (especialmente quando realmente chamado por fio). Desenvolvedores experientes usariam o padrão de fachada para fornecer uma interface de granulação mais grossa para o cliente. Essa fachada, por sua vez, fazia várias chamadas para diferentes métodos mais refinados. Em suma, isso reduziu bastante o número de chamadas de método necessárias e aumentou o desempenho.
fonte
Bridge é um adaptador aprimorado. O Bridge inclui adaptador e adiciona flexibilidade adicional a ele. Aqui está como os elementos da resposta de Ravindra são mapeados entre os padrões:
fonte
Na resposta principal, @James cita uma frase do GoF, página 219. Acho que vale a pena reproduzir a explicação completa aqui.
fonte
Suponha que você tenha uma classe Shape abstrata com uma funcionalidade de desenho (genérica / abstrata) e um Circle que implementa a Shape. O padrão de ponte é simplesmente uma abordagem de abstração bidirecional para dissociar a implementação (desenho em Círculo) e a funcionalidade genérica / abstrata (desenho na classe Forma).
O que isso realmente significa? À primeira vista, parece algo que você já está fazendo (por inversão de dependência). Portanto, não se preocupe em ter uma base de código menos modular ou mais modular. Mas é uma filosofia um pouco mais profunda por trás disso.
Pelo que entendi, a necessidade do padrão de uso pode surgir quando eu precisar adicionar novas classes que estão intimamente relacionadas ao sistema atual (como RedCircle ou GreenCircle) e que diferem apenas por uma única funcionalidade (como cor). E precisarei do padrão Bridge, especialmente se as classes de sistema existentes (Circle ou Shape) forem alteradas com frequência e você não quiser que as classes recém-adicionadas sejam afetadas por essas alterações. É por isso que a funcionalidade genérica do desenho é abstraída para uma nova interface, para que você possa alterar o comportamento do desenho independentemente de Shape ou Circle.
fonte