桥梁模式按类型不同实施

问题描述:

我搜索了桥梁模式的例子,下面的例子很好地解释了设计模式,但我对这个例子有一个问题。例如,如果手动齿轮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(); 
    } 
} 

在一个好的设计中,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使VehicleGear独立的实现。在这种情况下,Gear应该对Vehicle的不同实施行为有所不同,这是非常奇怪的。

+0

非常感谢。现在,我解决了桥梁模式试图解决什么样的问题。文章约翰Sonmez关于我在这里找到的桥梁模式https://simpleprogrammer.com/2015/06/08/design-patterns-simplified-the-bridge-pattern/解释非常好的模式。 –