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. 映射正交层次结构 - 一个用于抽象,一个用于实现