Frage

Was ist der Unterschied zwischen der Brücke und Adapter-Mustern?

War es hilfreich?

Lösung

  

"Adapter macht die Dinge funktionieren, nachdem sie entworfen wurde, Brücke macht sie   arbeiten, bevor sie sind. [GoF, P219] "

Effektiv die Adapter Muster ist nützlich, wenn Sie vorhandenen Code haben, ist es Dritten sein, oder im Haus, aber außerhalb Ihrer Kontrolle oder auf andere Weise nicht geändert werden, um ganz die Schnittstelle treffen Sie brauchen es. Zum Beispiel haben wir eine SuperWeaponsArray, die eine feine Auswahl an Doomsday Geräte steuern kann.

public class SuperWeaponsArray {
  /*...*/

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

Große. Außer wir erkennen, haben wir eine Atombombe in unserem Arsenal, das in beträchtlichem Ausmaß die Umwandlung in der Waffe Schnittstelle früher. Aber wir würden wirklich gerne hier arbeiten ... so etwas tun wir ... verkeilt es an!

NukeWeaponsAdaptor - basierend aus unserer Nuke-Klasse, aber die Waffe Schnittstelle exportieren. Süß, jetzt können wir sicher die Welt zerstören. Es scheint, wie wenig eine Flickschusterei, aber es macht die Dinge funktionieren.


Die Brücke Muster ist etwas, das man vorne implementieren up - wenn Sie wissen, dass Sie zwei orthogonalen Hierarchien haben, bietet es eine Möglichkeit, die Schnittstelle und die Umsetzung in einer solchen Art und Weise zu entkoppeln, die Sie nicht bekommen haben eine wahnsinnige Anzahl von Klassen. Angenommen, Sie haben:

MemoryMappedFile und DirectReadFile Arten von Dateiobjekten. Sagen wir, Sie zu lesen, Dateien aus verschiedenen Quellen in der Lage sein wollen (Vielleicht Linux vs. Windows-Implementierungen, etc.). Brücke hilft Ihnen vermeiden Abwicklung mit:

MemoryMappedWindowsFile MemoryMappedLinuxFile DirectReadWindowsFile DirectReadLinuxFile

Andere Tipps

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

Die Adapter-Muster sind mehr über Ihren vorhandenen Code immer mit einem neueren System oder der Schnittstelle zu arbeiten.

Wenn Sie eine Reihe von unternehmen Standard-Web-Service-APIs, die Sie zu einer anderen Anwendung vorhandener Erweiterungsschnittstelle anbieten mögen, können Sie eine Reihe von Adaptern Schreiben prüfen, dies zu tun. Beachten Sie, dass es eine Grauzone, und das ist mehr darüber, wie Sie das Muster technisch definieren, da andere Muster wie die Fassade ähnlich sind.

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

Die Brücke Muster werden Sie möglicherweise ermöglichen, alternative Implementierungen eines Algorithmus oder System hat.

Obwohl keine klassisches Brücke Muster Beispiel vorstellen, wenn Sie ein paar Implementierungen von einem Datenspeicher haben: Die eine ist effizient im Raum, die andere in Rohleistung effizient ist ... und Sie haben einen Business Case für das Angebot sowohl in Ihrem App oder Rahmen.

In Bezug auf Ihre Frage, „wo ich die Muster verwenden kann“, ist die Antwort, wo immer es sinnvoll, für Ihr Projekt macht! Vielleicht sollten Sie eine Klarstellung bearbeiten bietet die Diskussion zu führen, wo Sie glauben, Sie brauchen eine oder das andere verwenden.

Adapter:

  1. Es ist ein Strukturmuster
  2. Es ist nützlich, mit zwei inkompatible Schnittstellen
  3. zu arbeiten

UML-Diagramm: dofactory Artikel:

 image description hier

Ziel :. Definiert die domänenspezifische Schnittstelle, das Client verwendet

Adapter :. Paßt die Schnittstelle Adaptee an dem Ziel Schnittstelle

Adaptee : definiert eine vorhandene Schnittstelle, die Bedürfnisse anpassen

.

Client . Arbeitet mit Objekten des Ziel Schnittstelle konformen

Beispiel:

Quadrat und Rechteck sind zwei verschiedene Formen und immer Bereich () jeder von ihnen unterschiedliche Methoden erfordert. Aber immer noch Platz Arbeit auf Rechteck-Schnittstelle mit der Umwandlung von einigen der Eigenschaften.

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. Es ist Strukturmuster
  2. es abkoppelt eine Abstraktion von ihrer Implementierung und beide können unabhängig voneinander variieren
  3. Es ist möglich, weil Zusammensetzung wurde anstelle der Vererbung
  4. verwendet

EDIT: (per @quasoft Vorschlag)

Sie haben vier Komponenten in diesem Muster.

  1. Abstraction : Es definiert eine Schnittstelle

  2. RefinedAbstraction : Es implementiert Abstraktion:

  3. Implementor : Es definiert eine Schnittstelle für die Implementierung

  4. ConcreteImplementor : Es implementiert Implementor Schnittstelle

  5. .

Code-Snippet:

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

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

In Verbindung stehende Artikel:

Wann verwendet man die Brücke Muster? Wie unterscheidet es sich von Adapter-Muster?

Die wichtigsten Unterschiede: sourcemaking Artikel

  1. Adapter macht die Dinge funktionieren, nachdem sie entworfen wird; Brücke macht sie arbeiten, bevor sie sind.
  2. ist Brücke up-front entwickelt, um die Abstraktion und die Umsetzung zu lassen unabhängig voneinander variieren. Adapter nachgerüstet an unabhängige Klassen machen zusammen arbeiten.

Dieser Beitrag wurde schon für eine ganze Weile. Allerdings ist es wichtig zu verstehen, dass eine Fassade mit einem Adapter etwas ähnlich ist, aber es ist nicht ganz dasselbe. Ein Adapter „passt“ eine vorhandene Klasse zu einer in der Regel nicht-kompatiblen Client-Klasse. Nehmen wir an, dass Sie eine alte Workflow-System, das Ihre Anwendung wird als Client. Ihr Unternehmen könnte möglicherweise das Workflow-System mit einem neuen „unvereinbar“ einem (in Bezug auf Schnittstellen) ersetzen. In den meisten Fällen können Sie die Adapter-Muster verwenden und Code schreiben, der tatsächlich die neuen Workflow-Engine-Schnittstellen aufruft. Eine Brücke wird im allgemeinen in einer anderen Art und Weise verwendet. Wenn Sie tatsächlich ein System, das mit verschiedenen Dateisystemen arbeiten muß (das heißt die lokale Festplatte, NFS usw.) können Sie das Brückenmuster verwenden könnten und eine Abstraktionsschicht erstellen mit allen Dateisystemen zu arbeiten. Dies wäre im Grunde ein einfacher Anwendungsfall für das Brückenmuster sein. Die Fassade und der Adapter haben einige Eigenschaften teilen, aber Fassaden sind in der Regel verwendet, um eine vorhandene Schnittstelle / Klasse zu vereinfachen . In den frühen Tagen von EJBs gab es keine Ortsgespräche für EJBs. Entwickler erhalten immer die Stummel, verengt es auf und nannten ihn „pseudo-remote“. Diese oft verursacht Leistungsprobleme (insb. Wenn wirklich über den Draht genannt). Erfahrene Entwickler würden die Fassade Muster verwenden, um eine sehr grobkörnig Schnittstelle an den Client zu liefern. Diese Fassade würde dann wiederum tut mehrere Anrufe auf verschiedene feinkörnigen Methoden. Alles in allem reduziert dies deutlich die Anzahl der Methodenaufrufe erforderlich und erhöht die Leistung.

Angenommen, Sie eine abstrakte Klasse Shape mit einer (generic / abstrahiert) Zeichnung Funktionalität und einem Kreis haben, den die Form implementiert. Brückenmuster ist einfach ein Zwei-Wege-Abstraktion Ansatz die Umsetzung (Zeichnung in Kreis) und generic / abstrahiert Funktionalität (Zeichnung in der Shape-Klasse) zu entkoppeln.

Was bedeutet es wirklich? Auf den ersten Blick klingt es wie ein etwas, das Sie bereits (von Abhängigkeits Inversion) zu machen. So etwa keine Sorgen eine weniger ridig oder mehrere modulare Codebasis mit. Aber es ist ein bisschen tiefere Philosophie dahinter.

Von meinem Verständnis könnte die Notwendigkeit von Nutzungsmuster entstehen, wenn ich neue Klassen hinzufügen müssen, die mit dem aktuellen System eng miteinander verbunden sind (wie RedCircle oder Greencircle) und dem sie unterscheiden sich nur durch eine einzige Funktionalität (wie Farbe). Und ich werde Notwendigkeit Brücke Muster besonders, wenn die bestehenden Systemklassen (Kreis oder Shape) sind häufig geändert werden und Sie nicht wollen, neu hinzugefügte Klassen von diesen Änderungen betroffen sein. Also, warum die allgemeine Zeichnung Funktionalität weg in eine neue Schnittstelle abstrahiert, so dass Sie das Zeichnungsverhalten von Form oder Kreis unabhängig verändern können.

Bridge verbessert Adapter. Brücke enthält Adapter und fügt zusätzliche Flexibilität zu. Hier ist, wie Elemente aus Ravindra Antwort Karte zwischen Muster:

      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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top