2017-05-23 16 views
0

私はブリッジパターンの例を検索しました。次の例ではデザインパターンについて非常にうまく説明しましたが、この例について質問が1つあります。たとえば手動ギアhandleGearメソッドがCarとTruckの場合、自動ギアハンドルギアの実装は車やトラックで異なりますか?この状況のサンプルコードを提供してください。種類別ブリッジパターン別実装

/* 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());は動作しません。一つは、これはリスコフの原則に違反して言うことができるが、私はそれが
  • 高いカップリングは適用だか分からない:あなたがそうでCarGearTruckGearを持っている場合、あなたはとは異なるデザインを持ってGear
  • の特定の実装について今SportCarが「知っています」橋はあなたがVehicleGearの独立の実装を行うためにブリッジを使用

を提供しています。その場合、が異なる実装のために異なる動作をしなければならないという期待は、Vehicleです...非常に奇妙です。

+0

ありがとうございました。今私はundestand問題のどのような種類のブリッジパターンを解決しようとします。私がここで見つけたブリッジパターンについての記事John Sonmez https://simpleprogrammer.com/2015/06/08/design-patterns-simplified-the-bridge-pattern/は説明します非常によくパターン。 –

関連する問題