Design patterns 桥接模式按类型不同的实现

Design patterns 桥接模式按类型不同的实现,design-patterns,bridge,Design Patterns,Bridge,我搜索了桥接模式的示例,下面的示例很好地解释了设计模式,但我对这个示例有一个问题。例如,如果汽车和卡车的手动齿轮手柄方法不同,或者汽车或卡车的自动齿轮手柄实现不同,我应该怎么做?您能提供这种情况的示例代码吗 /* Implementor interface*/ interface Gear{ void handleGear(); } /* Concrete Implementor - 1 */ class ManualGear implements Gear{ public v

我搜索了桥接模式的示例,下面的示例很好地解释了设计模式,但我对这个示例有一个问题。例如,如果汽车和卡车的手动齿轮手柄方法不同,或者汽车或卡车的自动齿轮手柄实现不同,我应该怎么做?您能提供这种情况的示例代码吗

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

在良好的设计中,
齿轮
不应考虑外部环境。因此,无论安装在哪个
车辆上,它都应起作用

你可以这样写

class SportCar extens Car {
  public SportCar (Gear gear){
    if (gear instanceof SportCarGear) {
      super(gear);
    } else {
      super(new SportCarGear());
      // throwing an exception is even worse
    }
}
但是它完全错了,违反了太多的事情:

  • 用户期望:
    Car bolid=new SportCar(new TruckGear())将不会按预期操作。有人可能会说这违反了Liskov原则,但我不确定它是否适用
  • 更高的耦合:现在
    SportCar
    “知道”有关
    档位的具体实现
  • 如果您有
    CarGear
    TruckGear
    等,您的设计与Bridge产品不同


您可以使用桥接器使
Vehicle
Gear
的实现独立。在这种情况下,
档位
对于
车辆
的不同实现应起不同作用的任何期望都是。。。非常奇怪。

非常感谢。现在我不知道桥接模式试图解决什么样的问题。我在这里找到的关于桥接模式的文章JohnSonmez很好地解释了该模式。