2017-05-23 3 views
0

J'ai cherché des exemples pour le modèle de pont et l'exemple suivant explique très bien le motif de conception mais j'ai une question à propos de cet exemple. Que dois-je faire par exemple? l'engrenage automatique handleGear diffère pour la voiture ou le camion? Pourriez-vous s'il vous plaît fournir un exemple de code pour cette situation?Modèle de pont implémentation différente par type

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

Répondre

0

Dans une bonne conception, un Gear ne devrait pas se soucier de enviroment extérieur. Ainsi, il devrait agir quel que soit Vehicle installé.

Vous pouvez écrire quelque chose comme

class SportCar extens Car { 
    public SportCar (Gear gear){ 
    if (gear instanceof SportCarGear) { 
     super(gear); 
    } else { 
     super(new SportCarGear()); 
     // throwing an exception is even worse 
    } 
} 

mais il totalement faux et constitue une violation trop de choses:

  • attentes de l'utilisateur: Car bolid = new SportCar(new TruckGear()); n'agirez pas comme prévu. On pourrait dire cela viole le principe Liskov mais je ne suis pas sûr qu'il est applicable
  • couplage plus élevé: maintenant SportCar « sait » à propos de la mise en œuvre particulière de Gear
  • si vous avez CarGear, TruckGear et ainsi de suite, vous avez la conception différente de pont offre

Vous utilisez le pont pour faire des implémentations de Vehicle et Gear indépendant. Dans ce cas, toute attente que Gear devrait agir différemment pour différentes implémentations de Vehicle est ... très étrange.

+0

Merci beaucoup. Maintenant, je me défais de ce genre de problème de pont modèle essayer de résoudre.Article John Sonmez sur le modèle de pont que je trouve ici https://simpleprogrammer.com/2015/06/08/design-patterns-simplified-the-bridge-pattern/ explique très bien le motif. –