Alguém já usou o Bridge Pattern em um aplicativo do mundo real? Se sim, como você o usou? Sou eu, ou é apenas o Padrão do Adaptador com uma pequena injeção de dependência jogada na mistura? Ele realmente merece seu próprio padrão?
design-patterns
adapter
bridge
Charles Graham
fonte
fonte
Respostas:
Um exemplo clássico do padrão Bridge é usado na definição de formas em um ambiente de interface do usuário (consulte a entrada Wikipedia do padrão Bridge ). O padrão Bridge é um composto dos padrões Template e Strategy .
É uma visão comum alguns aspectos do padrão do adaptador no padrão Bridge. No entanto, para citar este artigo :
fonte
Há uma combinação das respostas de Federico e John .
Quando:
Refatorar para:
fonte
O padrão Bridge é uma aplicação do antigo conselho, "prefira composição sobre herança". Torna-se útil quando você deve subclassificar momentos diferentes de maneiras ortogonais entre si. Digamos que você deve implementar uma hierarquia de formas coloridas. Você não subclassaria Shape com retângulo e círculo e, em seguida, subclasse Rectangle com RedRectangle, BlueRectangle e GreenRectangle e o mesmo para Circle, não é? Você prefere dizer que cada forma tem uma cor e implementar uma hierarquia de cores, e esse é o padrão de ponte. Bem, eu não implementaria uma "hierarquia de cores", mas você entendeu ...
fonte
Quando:
Refatorar para:
fonte
Adapter e Bridge certamente estão relacionados, e a distinção é sutil. É provável que algumas pessoas que pensam estar usando um desses padrões estejam realmente usando o outro padrão.
A explicação que eu vi é que o Adapter é usado quando você está tentando unificar as interfaces de algumas classes incompatíveis que já existem . O adaptador funciona como um tipo de tradutor para implementações que podem ser consideradas herdadas .
Enquanto o padrão Bridge é usado para código com maior probabilidade de ser greenfield. Você está projetando o Bridge para fornecer uma interface abstrata para uma implementação que precisa variar, mas também define a interface dessas classes de implementação.
Drivers de dispositivo é um exemplo frequentemente citado de Bridge, mas eu diria que é um Bridge se você estiver definindo as especificações da interface para fornecedores de dispositivos, mas é um Adaptador se estiver usando drivers de dispositivo existentes e criando uma classe de wrapper para fornecer uma interface unificada.
Portanto, em termos de código, os dois padrões são muito semelhantes. Em termos de negócios, eles são diferentes.
Consulte também http://c2.com/cgi/wiki?BridgePattern
fonte
Na minha experiência, o Bridge é um padrão frequentemente recorrente, porque é a solução sempre que há duas dimensões ortogonais no domínio . Por exemplo, formas e métodos de desenho, comportamentos e plataformas, formatos de arquivo e serializadores e assim por diante.
E um conselho: sempre pense nos padrões de design da perspectiva conceitual , não da perspectiva da implementação. Do ponto de vista correto, o Bridge não pode ser confundido com o Adapter, porque resolve um problema diferente, e a composição é superior à herança, não por causa de si mesma, mas porque permite lidar com preocupações ortogonais separadamente.
fonte
A intenção do Bridge e do Adapter é diferente e precisamos dos dois padrões separadamente.
Padrão de ponte:
Use o padrão Bridge quando:
A resposta de John Sonmez mostra claramente a eficácia do padrão de ponte na redução da hierarquia de classes.
Você pode consultar o link da documentação abaixo para obter uma melhor visão do padrão de ponte com o exemplo de código
Padrão do adaptador :
Principais diferenças:
Pergunta SE relacionada com diagrama UML e código de trabalho:
Diferença entre o padrão Bridge e o adaptador
Artigos úteis:
artigo de padrão de ponte de criação de fontes
artigo do padrão do adaptador de criação de fontes
artigo de padrão de ponte journaldev
EDITAR:
Exemplo do mundo real do padrão de ponte (conforme sugestão de meta.stackoverflow.com, exemplo de site de documentação incorporado neste post, pois a documentação vai se pôr)
O padrão de ponte desacopla a abstração da implementação para que ambos possam variar independentemente. Foi alcançado com a composição e não com a herança.
Padrão de ponte UML da Wikipedia:
Você tem quatro componentes neste padrão.
Abstraction
: Define uma interfaceRefinedAbstraction
: Implementa abstração:Implementor
: Define uma interface para implementaçãoConcreteImplementor
: Implementa a interface do implementador.The crux of Bridge pattern :
Duas hierarquias de classe ortogonais usando composição (e sem herança). A hierarquia de abstração e a hierarquia de implementação podem variar independentemente. A implementação nunca se refere à abstração. Abstração contém a interface de Implementação como um membro (através da composição). Essa composição reduz mais um nível de hierarquia de herança.Caso de uso de palavra real:
Permita que veículos diferentes tenham ambas as versões do sistema manual e automático.
Código de exemplo:
resultado:
Explicação:
Vehicle
é uma abstração.Car
eTruck
são duas implementações concretas deVehicle
.Vehicle
define um método resumo:addGear()
.Gear
é interface do implementadorManualGear
eAutoGear
são duas implementações deGear
Vehicle
contémimplementor
interface em vez de implementar a interface.Compositon
A interface do implementador é o cerne desse padrão: permite que a abstração e a implementação variem independentemente.Car
eTruck
definir a implementação (abstração redefinido) de abstração:addGear()
: ContémGear
- De qualquerManual
ouAuto
Casos de uso para o padrão Bridge :
fonte
Eu usei o padrão de ponte no trabalho. Eu programa em C ++, onde geralmente é chamado de idioma PIMPL (ponteiro para implementação). Se parece com isso:
Neste exemplo
class A
contém a interface eclass Aimpl
a implementação.Um uso para esse padrão é expor apenas alguns dos membros públicos da classe de implementação, mas não outros. No exemplo, apenas
Aimpl::foo()
pode ser chamado através da interface pública deA
, mas nãoAimpl::bar()
Outra vantagem é que você pode definir
Aimpl
em um arquivo de cabeçalho separado que não precise ser incluído pelos usuários doA
. Tudo o que você precisa fazer é usar uma declaração de encaminhamento deAimpl
antes deA
ser definida e mover as definições de todas as funções de membro referenciadaspImpl
no arquivo .cpp. Isso permite manter oAimpl
cabeçalho privado e reduzir o tempo de compilação.fonte
Para colocar exemplo de forma no código:
A saída é:
Observe a facilidade com que novas cores e formas podem ser adicionadas ao sistema sem levar a uma explosão de subclasses devido a permutações.
fonte
para mim, eu penso nisso como um mecanismo onde você pode trocar interfaces. No mundo real, você pode ter uma classe que pode usar mais de uma interface. O Bridge permite que você troque.
fonte
Você está trabalhando para uma companhia de seguros onde desenvolve um aplicativo de fluxo de trabalho que gerencia diferentes tipos de tarefas: contabilidade, contrato, reclamações. Esta é a abstração. No lado da implementação, você deve poder criar tarefas de diferentes fontes: email, fax, e-messaging.
Você inicia seu design com estas classes:
Agora, como cada fonte deve ser tratada de uma maneira específica, você decide especializar cada tipo de tarefa:
Você acaba com 13 aulas. Adicionar um tipo de tarefa ou tipo de fonte se torna desafiador. Usar o padrão de ponte produz algo mais fácil de manter, dissociando a tarefa (a abstração) da fonte (que é uma preocupação de implementação):
Adicionar um tipo de tarefa ou fonte agora é muito mais fácil.
Nota: A maioria dos desenvolvedores não criaria a hierarquia de 13 classes antecipadamente para lidar com esse problema. No entanto, na vida real, talvez você não conheça com antecedência o número de tipos de fonte e tarefa; se você tiver apenas uma fonte e dois tipos de tarefas, provavelmente não desacoplaria a Tarefa da Origem. Em seguida, a complexidade geral aumenta à medida que novas fontes e tipos de tarefas são adicionados. Em algum momento, você irá refatorar e, na maioria das vezes, acabar com uma solução semelhante a uma ponte.
fonte
fonte