Pergunta

Qual é a diferença entre os padrões Ponte e adaptador?

Foi útil?

Solução

"Adaptador torna as coisas trabalho depois que eles são projetados; Ponte torna trabalho antes que eles são. [GoF, P219] "

Efetivamente, o O adaptador padrão é útil quando você tiver código existente, seja de terceiros, ou em casa, mas fora de seu controle, ou de outra forma não alterável para atender completamente a interface que você precisa a. Por exemplo, temos um SuperWeaponsArray que pode controlar uma matriz fina de máquina apocalíptica.

public class SuperWeaponsArray {
  /*...*/

  public void destroyWorld() {
    for (Weapon w : armedWeapons) {
      w.fire();
    }
  }
}

Grande. Exceto percebemos que temos um dispositivo nuclear em nosso arsenal que muito antecede a conversão para a interface de Arma. Mas nós realmente gostaria que ele funcione aqui ... então o que vamos fazer ... encostá-lo no!

NukeWeaponsAdaptor - baseado fora de nossa classe Nuke, mas exportar a interface Arma. Doce, agora nós certamente pode destruir o mundo. Parece pouco de um truque, mas isso torna as coisas trabalho.


O Ponte padrão é algo que você implementar na frente - se você sabe que tem duas hierarquias ortogonais, fornece uma maneira de separar a interface ea implementação de tal forma que você não fique um número de classes de louco. Vamos dizer que você tem:

tipos

MemoryMappedFile e DirectReadFile de objetos de arquivo. Vamos dizer que você quer ser capaz de ler arquivos de várias fontes (talvez implementações Linux vs. Windows, etc.). Ponte ajuda a evitar a liquidação com:

MemoryMappedWindowsFile MemoryMappedLinuxFile DirectReadWindowsFile DirectReadLinuxFile

Outras dicas

http://en.wikipedia.org/wiki/Adapter_pattern

O padrão Adapter é mais sobre como obter o seu código existente para trabalhar com um sistema mais novo ou interface.

Se você tem um conjunto de APIs de serviços web da empresa-padrão que você gostaria de oferecer a interface de extensibilidade existente de outro aplicativo, você pode considerar escrever um conjunto de adaptadores para fazer isso. Note-se que há uma zona cinzenta e este é mais sobre como você define tecnicamente o padrão, uma vez que outros padrões como a fachada são semelhantes.

http://en.wikipedia.org/wiki/Bridge_pattern

O padrão Bridge vai permitir que você, eventualmente, ter implementações alternativas de um algoritmo ou sistema.

Apesar de não ser um clássico Ponte exemplo padrão, imagine se você tivesse algumas implementações de um armazenamento de dados: um é eficiente no espaço, o outro é eficiente no desempenho bruto ... e você tem um caso de negócios para oferecer, tanto em sua aplicativo ou quadro.

Em termos de sua pergunta, "onde eu posso usar que padrão", a resposta é, onde quer que faz sentido para o seu projeto! considerar talvez oferecendo uma edição de esclarecimento para orientar a discussão sobre onde você acredita que você precisa usar um ou o outro.

Adaptador:

  1. É um padrão estrutural
  2. É útil para os trabalhos com duas interfaces incompatíveis

UML Diagrama: de dofactory artigo:

 enter descrição da imagem aqui

Meta :. Define a interface específica do domínio que usa cliente

O adaptador :. Adapta o Adaptee interface para a interface alvo

Adaptee :. Define uma interface existente que as necessidades de adaptação

Cliente :. Colabora com objetos acordo com a interface alvo

Exemplo:

quadrado e do retângulo são duas formas diferentes e área de obtenção de () de cada um deles requer métodos diferentes. Mas ainda assim o trabalho Square na interface do retângulo com conversão de algumas das propriedades.

public class AdapterDemo{
    public static void main(String args[]){
        SquareArea s = new SquareArea(4);
        System.out.println("Square area :"+s.getArea());
    }
}

class RectangleArea {
    public int getArea(int length, int width){
        return length * width;
    }
}

class SquareArea extends RectangleArea {

    int length;
    public SquareArea(int length){
        this.length = length;
    }
    public int getArea(){
        return getArea(length,length);
    }
}

Bridge:

  1. É padrão estrutural
  2. que desacopla uma abstração de sua implementação e ambos podem variar independentemente
  3. É possível porque composição foi usado no lugar de herança

EDIT: (conforme sugestão @quasoft)

Você tem quatro componentes neste padrão.

  1. Abstraction : Define uma interface

  2. RefinedAbstraction : Ele implementa a abstração:

  3. Implementor : Define uma interface para a implementação

  4. ConcreteImplementor :. Ele implementa a interface Implementor

Código trecho:

Gear gear = new ManualGear();
Vehicle vehicle = new Car(gear);
vehicle.addGear();

gear = new AutoGear();
vehicle = new Car(gear);
vehicle.addGear();

post relacionado:

Quando você usa o padrão Bridge? Como é que é diferente do padrão Adapter?

Principais diferenças: de sourcemaking artigo

  1. Adaptador torna as coisas trabalho depois que eles são projetados; Ponte torna o trabalho antes que eles são.
  2. Ponte é projetado up-front para deixar a abstração ea implementação variar independentemente. Adaptador está adaptado para fazer aulas não relacionados trabalhar juntos.

Este post tem sido em torno de um bom tempo. No entanto, é importante compreender que a fachada é um pouco semelhante a um adaptador, mas não é bem a mesma coisa. Um adaptador "adapta" uma classe existente para uma classe de cliente geralmente não-compatível. Digamos que você tem um sistema de fluxo de trabalho antigo que seu aplicativo está usando como um cliente. Sua empresa poderia substituir o sistema de fluxo de trabalho com um novo "incompatíveis" (em termos de interfaces). Na maioria dos casos, você pode usar o padrão adaptador e escrever código que realmente chama as interfaces do novo motor de fluxo de trabalho. Uma ponte é geralmente usado em uma forma diferente. Se você realmente tem um sistema que precisa trabalhar com diferentes sistemas de arquivo (ou seja, disco local, NFS, etc.), você pode usar o padrão de ponte e criar uma camada de abstração para trabalhar com todos os seus sistemas de arquivos. Este seria basicamente um caso de uso simples para o padrão de ponte. A fachada eo adaptador compartilham algumas propriedades, mas fachadas são normalmente utilizados para simplificar uma interface / classe existente . Nos primeiros dias de EJBs não havia chamadas locais para EJBs. Desenvolvedores sempre obteve o stub, reduzi-lo e chamou-lhe "pseudo-remotamente". Isso muitas vezes vezes causado problemas de desempenho (esp. Quando realmente chamado sobre o fio). desenvolvedores experientes usaria o padrão de fachada para fornecer uma interface muito grosseiro para o cliente. Esta fachada, então, por sua vez, fazer várias chamadas para diferentes métodos mais de grão fino. Tudo somado, este bastante reduzido o número de chamadas de método necessário e maior desempenho.

Suponha que você tem uma classe Shape abstrato com uma (genérico / abstraída) desenho funcionalidade e um círculo que implementa o Shape. Ponte padrão é simplesmente uma abordagem abstração de duas vias para desacoplar a implementação (desenho em Circle) e funcionalidade genérica / abstraída (desenho na classe Shape).

O que isso realmente significa? À primeira vista, parece que a algo que você já está fazendo (por inversão de dependência). Então não se preocupe sobre ter uma base de código menos ridig ou mais modular. Mas é a filosofia um pouco mais profundo por trás dele.

No meu entendimento, a necessidade de padrão de uso pode emergir quando eu preciso adicionar novas classes que estão estreitamente relacionadas com o sistema atual (como RedCircle ou GreenCircle) e que diferem em apenas uma única funcionalidade (como cor). E eu vou padrão Bridge necessidade particularmente se as classes de sistema existentes (círculo ou forma) devem ser mudados frequentemente e você não quer que as classes adicionadas recentemente a ser afetada a partir dessas mudanças. Então é por isso que a funcionalidade de desenho genérico é abstraída em uma nova interface de modo que você pode alterar o comportamento independente desenho de Shape ou Circle.

Bridge é melhorada Adapter. Ponte inclui adaptador e adiciona flexibilidade adicional a ele. Aqui está como elementos de mapa A resposta de Ravindra entre os padrões:

      Adapter  |    Bridge
    -----------|---------------
    Target     | Abstraction
    -----------|---------------
               | RefinedAbstraction
               |
               |   This element is Bridge specific. If there is a group of 
               |   implementations that share the same logic, the logic can be placed here.
               |   For example, all cars split into two large groups: manual and auto. 
               |   So, there will be two RefinedAbstraction classes.
    -----------|--------------- 
    Adapter    | Implementor
    -----------|---------------
    Adaptee    | ConcreteImplementor
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top