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很好地解释了该模式。