2017-05-23 45 views
0

我搜索了橋樑模式的例子,下面的例子很好地解釋了設計模式,但我對這個例子有一個問題。例如,如果手動齒輪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(); 
    } 
} 

回答

0

在一個好的設計中,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/解釋非常好的模式。 –