Suche…


Brückenmuster-Implementierung in Java

Brückenmuster entkoppelt die Abstraktion von der Implementierung, sodass beide unabhängig voneinander variieren können. Es wurde eher durch Komposition als durch Vererbung erreicht.

Bridge-UML-Diagramm aus Wikipedia:

Geben Sie hier die Bildbeschreibung ein

Sie haben vier Komponenten in diesem Muster.

Abstraction : Es definiert eine Schnittstelle

RefinedAbstraction : Es implementiert Abstraktion:

Implementor : Definiert eine Schnittstelle für die Implementierung

ConcreteImplementor : Implementiert die Implementor-Schnittstelle.

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 eine Implementierungsschnittstelle als Mitglied (durch Komposition). Diese Zusammensetzung reduziert eine weitere Vererbungshierarchieebene.

Echtes Wort Anwendungsfall:

Ermöglichen Sie, dass verschiedene Fahrzeuge sowohl manuelle als auch automatische Gangschaltung 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:

  1. Vehicle ist eine Abstraktion.
  2. Car und Truck sind zwei konkrete Implementierungen von Vehicle .
  3. Vehicle definiert eine abstrakte Methode: addGear() .
  4. Gear ist Implementierer-Schnittstelle
  5. ManualGear und AutoGear sind zwei Implementierungen von Gear
  6. Vehicle enthält implementor Schnittstelle, anstatt die Schnittstelle zu implementieren. Compositon der Implementierer-Schnittstelle ist das Kernstück dieses Musters: Sie ermöglicht die Abstraktion und Implementierung unabhängig voneinander.
  7. Car und Truck definieren die Implementierung (neu definierte Abstraktion) für die Abstraktion: addGear() : Sie enthält Gear - entweder Manual oder Auto

Anwendungsfall (e) für Brückenmuster :

  1. Abstraktion und Implementierung können sich unabhängig voneinander ändern und sind zur Kompilierzeit nicht gebunden
  2. Kartieren Sie orthogonale Hierarchien - eine für die Abstraktion und eine für die Implementierung .


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow