Padrão Bridge - Um exemplo mais simples de entender

Pessoal, estou estudando Design Patterns, e estava indo bem, até encontrar o padrão Bridge. Eu até entendi o porquê dele existir, só não vejo o porquê de usa-lo, logo, concluo que eu não entendi o espírito da coisa. Eu procurei aqui no fórum, mas a maioria dos exemplos é usando como exemplos as classes AWT ou implementações de Drivers JDBC. Sinceramente acho que esses tipos de exemplos pouco ajudam. Sempre tento pegar exemplos o mais próximo possível do mundo real, pois ajuda muito atender (por exemplo, o padrão Adapter, só consegui mesmo entender, quando comecei a pensar em como seria um adaptador de um câmbio automático para um câmbio de cinco marchas). Então, pergunto: alguém aqui tem algum exemplo de padrão Bridge, sem ser JDBC, AWT, ou qualquer outra coisa que não temos no mundo real? Eu até tentei usar como exemplo a implementação de um motor (sempre carros! rs!), pensei no seguinte:

Eu tenho um classe abstrata chamada MOTOR. Eu posso ligar um motor, acelerar e desligar. Ou seja, eu teria:

Motor
ligar()
acelerar()
desligar()

Blz. Aí vamos supor que agora eu tenha que ter dois tipos de motores concretos: um motor elétrico (MotorEletrico) e um motor a explosão (MotorExplosao). Vamos supor que o comportamento de ligar, acelerar e desligar desses motores sejam totalmente diferentes um do outro. Ora, eu consigo resolver isso facilmente com herança. Faço MotorEletrico e MotorExplosao herdar da classe Motor e um abraço! Implemento os métodos de cada motor.

Pergunto: Por que eu iria querer usar o Bridge!?

Quem souber me explicar, pois realmente, eu não tô conseguindo entender a utilidade disso ainda…

Desde já, agradeço!

Pessoal,

Acho que finalmente consegui entender e implementar o padrão no exemplo que dei acima. Alguém poderia corrigir?

Entendi também o porquê desse padrão: como a implementação da classe fica por conta de outra classe, eu poderia alterar o comportamento com muito mais facilidade, sem ter que afetar minhas classes ancestrais… bom, acho que é isso.

Gostaria que alguém desse uma olhadinha nos arquivos em anexo, e verificasse, pra ver se eu implementei certo.

Grato desde já.

Caraca, ninguém!?

O padrão responde a isso. Se vc não sabe a resposta isto vc não entendeu o padrão.
A primeira linha do padrão explica porque usar : desacoplar contrato de implementação tal que ambos possam evoluir em separado.

Sim, Sérgio, eu entendi sim. Veja meu segundo post. Até me atrevi a implementar o padrão. Queria saber se está certo o que fiz. Você poderia corrigi-lo? Grato.

aqui pode encontrar mais:

http://www.oodesign.com/bridge-pattern.html

Bridge como o próprio nome diz é uma “ponte”.

Imagine a ponte Rio-Niteroi, ela liga lógicamente a cidade do Rio com Niterói.
Ambas as cidades podem derrubar construcoes, criar novas, alterar ruas e etc. Porém a ponte sempre vai estar lá pra levar o pessoal do Rio pra Niterói e de Niterói pro Rio. Não poderia existir nome melhor pra esse patern, pois é exatamente isso que ele faz, no caso do JDBC por exemplo, tanto os provedores de drivers quando a implementação do JDBC podem evoluir sem deixar de se comunicarem.

Foi o suficiente?

Steveo, valeu pelo link. Aqui no meu trabalho é bloqueado, mas chegando em casa vou dar uma olhada.

Denis, obrigado por responder. O conceito do padrão eu entendi, veja no meu segundo post. Eu gostaria que alguém desse uma olhada no código que escrevi, implementando o padrão (está em anexo, no segundo post). Porque, uma coisa é entender o conceito, outra é implementa-lo “sem colar” de exemplos já prontos. E foi exatamente o que tentei fazer.

Valeu!

Cara, desculpa não parar pra ler o seu código (sem tempo), mas quando eu estava estudando pro SCEA o melhor exemplo que encontrei foi o da Wikipedia.

Olha lá que tem o bridge implementado em java, ruby e scala. Ai basta bater com o seu código e ver se vc está fazendo a mesma coisa.

Abracos!

Valeu Denis!

Eu mudaria aí o seguinte: criaria um objeto implantador e o chamaria de dentro da classe Motor…

Implantador i = new Implantador();

abstract void acelera {
i.acelera();
}