java 中的橋模式實現

橋接模式將抽象與實現分離,以便兩者可以獨立變化。它是通過組合而不是繼承來實現的。

來自維基百科的橋 UML 圖:

StackOverflow 文件

這種模式中有四個元件。

Abstraction:它定義了一個介面

RefinedAbstraction:它實現了抽象:

Implementor:它定義了一個實現介面

ConcreteImplementor:它實現了 Implementor 介面。

The crux of Bridge pattern : 使用組合(沒有繼承)的兩個正交類層次結構。抽象層次結構和實現層次結構可以獨立變化。實現從未引用抽象。抽象包含實現介面作為成員(通過組合)。此組合減少了一個級別的繼承層次結構。

真實用例:

使不同的車輛具有手動和自動齒輪系統的兩種版本。

示例程式碼:

/* 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();
    }
}

輸出:

Car handles Manual gear
Car handles Auto gear
Truck handles Manual gear
Truck handles Auto gear

說明:

  1. Vehicle 是一個抽象。
  2. CarTruckVehicle 的兩個具體實現。
  3. Vehicle 定義了一個抽象方法:addGear()
  4. Gear 是實現者介面
  5. ManualGearAutoGearGear 的兩個實現
  6. Vehicle 包含 implementor 介面而不是實現介面。實現者介面的 Compositon 是這種模式的關鍵: 它允許抽象和實現獨立變化。
  7. CarTruck 為抽象定義實現(重新定義的抽象):addGear():它包含 Gear - ManualAuto

Bridge 模式的用例

  1. 抽象實現可以彼此獨立地更改,並且它們在編譯時不受約束
  2. 對映正交層次結構 - 一個用於抽象,一個用於實現