Padrão de Projeto Bridge

O propósito do padrão Bridge é desacoplar uma abstração de sua implementação, de modo que as duas possam variar independentemente.
Os participantes do padrão são:

  • Abstraction
  • RefinedAbstraction
  • Implementor
  • ConcreteImplementor

Eu entendo perfeitamente que podemos “projetar” abstração e implementação independentemente, porque o padrão evita que eles estejam fortemente acoplados.
No entanto, estou tendo dificuldades para entender como a abstração pode variar. Considerando que as diversas RefinedAbstraction são extensões de Abstraction, ou seja, sua interface possui métodos diferentes da interface comum, em que sentido as abstrações podem variar???
Por exemplo, considere o código abaixo:

public static void main(String[] args) {
Abstraction r = new RefinedAbstraction(new ConcreteImplementor);
// mas agora, e se eu quisesse usar os métodos específicos de //RefinedAbstraction?
// Eu teria que trabalhar com o tipo concreto (ou fazer casts)
RefinedAbstraction r = new RefinedAbstraction(new ConcreteImplementor);
r.specificMethod();
}

Mas se eu trabalhar diretamente com o tipo concreto, então eu não poderia variar as abstrações. Estou chegando a conclusão de que não é esse o nível de variação que o padrão propõe, e sim, que eu possa ter diversas abstrações independente de implementações, mas na ora de usar eu codifico considerando UMA abstração particular. Seria isso???

Obrigado

Tomei a liberdade de da um printScreen no diagram de classe do bridge que tem no livro ADDISON-WESLEY–Design-Patterns–Elements-of-Reusable.(O diagrama é bem auto explicativo)

E vou dar uma comentada para você derrepente lhe ajude a resolver suas dúvidas.

Nesse diagrama vc tem:

  • Window que é a abstração mais alta da janela e que vai receber uma abstração da interface de implementação de janelas. È da Window que vc vai herdar para fazer uma janela de sobre pro exemplo;
  • WindowImp que é a abstração de implementação das janelas. É de Window Imp que vc vai herdar para fazer com que todas suas janelas funcione no PalmOS;

Sim, no caso entao, como eu coloquei, o objetivo é vc ter a hierarquia de abstrações diferente desacoplada da hierarquia de implementações. Mas, uma vez que eu escolha determinada abstração, eu não posso alterá-la.
Eu devo fazer assim IconWindow window = new IconWindow() ; e nao assim: Window window = new IconWindow(); caso eu queria trabalhar com janelas IconWindow(), certo? Eu estava pensando que poderia variar a abstração em tempo de execução, mas nao é esse o propósito, ok? O propósito é só desvincular abstração de implementação, sem a flexibilidade de tornar as abstrações intercambiáveis (a não ser que estas possuam a mesma interface, o que na maioria das vezes nao é o caso).

Entendi bem?

Bridge serve para vc desacoplar a implementação da abstração!

[quote=Alexandre Gazola]Sim, no caso entao, como eu coloquei, o objetivo é vc ter a hierarquia de abstrações diferente desacoplada da hierarquia de implementações. Mas, uma vez que eu escolha determinada abstração, eu não posso alterá-la.
[/quote]
Bridge serve para vc desacoplar a implementação da abstração!
Vc pode ir para cima na arvore ex: Eu posso usar uma IconWindow como Window

Window win = new IconWindow();

Certo para vc trabalhar com IconWindow vc deve declarar e criar uma IconWindow

Vc pode variar a abstração sim como dito acima:
Vc pode ir para cima na arvore ex: Eu posso usar uma IconWindow como Window

[quote=Alexandre Gazola]
O propósito é só desvincular abstração de implementação, sem a flexibilidade de tornar as abstrações intercambiáveis (a não ser que estas possuam a mesma interface, o que na maioria das vezes nao é o caso).
Entendi bem?[/quote]

Se vc criar umaboa hierarquia vc poderá intercambia-las sim!