Die Absicht von Bridge und Adapter ist unterschiedlich und wir benötigen beide Muster getrennt.
Brückenmuster:
- Es ist ein Strukturmuster
- Abstraktion und Implementierung sind zur Kompilierungszeit nicht gebunden
- Abstraktion und Implementierung - beide können ohne Auswirkungen auf den Kunden variieren
- Verwendet Komposition über Vererbung.
Verwenden Sie das Brückenmuster, wenn:
- Sie möchten eine Laufzeitbindung der Implementierung,
- Sie haben eine Vielzahl von Klassen, die sich aus einer gekoppelten Schnittstelle und zahlreichen Implementierungen ergeben.
- Sie möchten eine Implementierung für mehrere Objekte freigeben.
- Sie müssen orthogonale Klassenhierarchien zuordnen.
Die Antwort von @ John Sonmez zeigt deutlich die Wirksamkeit des Brückenmusters bei der Reduzierung der Klassenhierarchie.
Unter dem folgenden Dokumentationslink finden Sie einen besseren Einblick in das Brückenmuster anhand eines Codebeispiels
Adaptermuster :
- Es ermöglicht zwei nicht miteinander verbundenen Schnittstellen, über die verschiedenen Objekte zusammenzuarbeiten und möglicherweise dieselbe Rolle zu spielen.
- Es ändert die ursprüngliche Schnittstelle.
Hauptunterschiede:
- Mit dem Adapter funktionieren die Dinge, nachdem sie entworfen wurden. Bridge lässt sie arbeiten, bevor sie es sind.
- Bridge wurde von vornherein so konzipiert, dass Abstraktion und Implementierung unabhängig voneinander variieren können . Der Adapter wird nachgerüstet, damit nicht verwandte Klassen zusammenarbeiten.
- Die Absicht: Mit dem Adapter können zwei nicht miteinander verbundene Schnittstellen zusammenarbeiten. Mit Bridge können Abstraktion und Implementierung unabhängig voneinander variieren.
Verwandte SE-Frage mit UML-Diagramm und Arbeitscode:
Unterschied zwischen Brückenmuster und Adaptermuster
Nützliche Artikel:
Artikel zur Herstellung von Brückenmustern
Artikel zur Herstellung von Quellenadaptern
journaldev Brückenmuster Artikel
BEARBEITEN:
Beispiel für ein Bridge-Muster in der realen Welt (Gemäß dem Vorschlag von meta.stackoverflow.com wurde ein Beispiel für eine Dokumentationssite in diesen Beitrag aufgenommen, da die Dokumentation untergehen wird.)
Das Brückenmuster entkoppelt die Abstraktion von der Implementierung, sodass beide unabhängig voneinander variieren können. Es wurde eher mit Komposition als mit Vererbung erreicht.
Brückenmuster UML aus Wikipedia:
Sie haben vier Komponenten in diesem Muster.
Abstraction
: Es definiert eine Schnittstelle
RefinedAbstraction
: Es implementiert Abstraktion:
Implementor
: Es definiert eine Schnittstelle für die Implementierung
ConcreteImplementor
: Es implementiert die Implementiererschnittstelle.
The crux of Bridge pattern :
Zwei orthogonale Klassenhierarchien mit Komposition (und ohne Vererbung). Die Abstraktionshierarchie und die Implementierungshierarchie können unabhängig voneinander variieren. Die Implementierung bezieht sich niemals auf Abstraktion. Die Abstraktion enthält die Implementierungsschnittstelle als Mitglied (durch Komposition). Diese Zusammensetzung reduziert eine weitere Ebene der Vererbungshierarchie.
Echtes Wort Anwendungsfall:
Ermöglichen Sie verschiedenen Fahrzeugen, sowohl Versionen des manuellen als auch des automatischen Getriebesystems zu haben.
Beispielcode:
/* Implementor interface*/
interface Gear{
void handleGear();
}
/* Concrete Implementor - 1 */
class ManualGear implements Gear{
public void handleGear(){
System.out.println("Manual gear");
}
}
/* Concrete Implementor - 2 */
class AutoGear implements Gear{
public void handleGear(){
System.out.println("Auto gear");
}
}
/* Abstraction (abstract class) */
abstract class Vehicle {
Gear gear;
public Vehicle(Gear gear){
this.gear = gear;
}
abstract void addGear();
}
/* RefinedAbstraction - 1*/
class Car extends Vehicle{
public Car(Gear gear){
super(gear);
// initialize various other Car components to make the car
}
public void addGear(){
System.out.print("Car handles ");
gear.handleGear();
}
}
/* RefinedAbstraction - 2 */
class Truck extends Vehicle{
public Truck(Gear gear){
super(gear);
// initialize various other Truck components to make the car
}
public void addGear(){
System.out.print("Truck handles " );
gear.handleGear();
}
}
/* Client program */
public class BridgeDemo {
public static void main(String args[]){
Gear gear = new ManualGear();
Vehicle vehicle = new Car(gear);
vehicle.addGear();
gear = new AutoGear();
vehicle = new Car(gear);
vehicle.addGear();
gear = new ManualGear();
vehicle = new Truck(gear);
vehicle.addGear();
gear = new AutoGear();
vehicle = new Truck(gear);
vehicle.addGear();
}
}
Ausgabe:
Car handles Manual gear
Car handles Auto gear
Truck handles Manual gear
Truck handles Auto gear
Erläuterung:
Vehicle
ist eine Abstraktion.
Car
und Truck
sind zwei konkrete Implementierungen von Vehicle
.
Vehicle
definiert eine abstrakte Methode : addGear()
.
Gear
ist Implementiererschnittstelle
ManualGear
und AutoGear
sind zwei Implementierungen von Gear
Vehicle
enthält eine implementor
Schnittstelle, anstatt die Schnittstelle zu implementieren. Compositon
der Implementiererschnittstelle ist der Kern dieses Musters: Es ermöglicht, dass Abstraktion und Implementierung unabhängig voneinander variieren.
Car
und Truck
definieren Sie die Implementierung (neu definierte Abstraktion) für die Abstraktion addGear()
:: Sie enthält Gear
- Entweder Manual
oderAuto
Anwendungsfall (e) für das Brückenmuster :
- Abstraktion und Implementierung können sich unabhängig voneinander ändern und sind beim Kompilieren nicht gebunden
- Orthogonale Hierarchien zuordnen - eine für die Abstraktion und eine für die Implementierung .