【问题标题】:Bridge pattern different implementation by type桥接模式按类型不同的实现
【发布时间】:2017-10-23 02:38:26
【问题描述】:

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

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

【问题讨论】:

    标签: design-patterns bridge


    【解决方案1】:

    在一个好的设计中,Gear 不应该关心外部环境。因此,无论它安装在哪个 Vehicle 上,它都应该起作用。

    你可以写类似的东西

    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“知道”Gear 的特定实现
    • 如果您有CarGearTruckGear 等,您的设计与Bridge 提供的不同

    您使用 Bridge 使 VehicleGear 的实现独立。在那种情况下,任何期望GearVehicle 的不同实现会有不同的行为是......非常奇怪。

    【讨论】:

    • 非常感谢。现在我不明白桥模式试图解决什么样的问题。关于我在这里找到的桥模式的文章 John Sonmez simpleprogrammer.com/2015/06/08/… 很好地解释了这种模式。
    猜你喜欢
    • 1970-01-01
    • 2020-10-28
    • 2011-07-21
    • 2011-07-08
    • 2021-06-25
    • 2013-07-14
    • 1970-01-01
    • 2013-05-31
    • 2011-12-20
    相关资源
    最近更新 更多