2016-12-29 3 views
2

私はPlaneというクラスを持っています。データベースのサブクラスを扱うのに最適なデザインですか?

class Plane { 
    private int _planeId;  

    public int getModel() { } 

    public int getNumberOfPassengers() {} 
} 

そしてI平面に依存し、それにいくつかのロジックを追加しPlaneServiceと呼ばれる別のクラス、

class PlaneService { 
    private Plane _plane; 

    public PlaneService(Plane _plane) { 
     this._plane = _plane; 
    } 

    public void validdatePlane(int planeId) { 
     fetch plane from planeId from db. 
     if (plane.getNumberOfPassengers() is in range of {100 to 300}) 
      plane is valid. 
    } 
} 

しかし、今、新たな要件が入って来:飛行機は、戦闘機をサポートするように拡張されなければなりません。したがって、新しいデザインは次のようになります。

class Plane { 
     private int _planeId;  

     public int getModel() { } 
    } 

    class PassengerPlane extends Plane { 
     public int getNumberOfPassengers() {} 
    } 

    class FigherJet extends Plane { 
     public boolean isCommissioned() {} 
    } 

私の質問は、どのようにして 'PlaneSvc'をOOP方法で設計することができますか?良いデザインパターンはありますか?

は現在、私のコードは次のようになります。

class PlaneService { 
     private Plane _plane; 

     public PlaneService(Plane _plane) { 
      this._plane = _plane; 
     } 

     public void validdatePlane(int planeId) { 
      fetch CommercialPlane from planeId from db. 
      if (commericialPlaneObject != null) { 
       if (plane.getNumberOfPassengers() is in range of {100 to 300}) 
       plane is valid. 
      } 
      fetch FighterPlaneObject from planeId from db. 
      if (FighterPlaneObject != null) { 
       if (fighterplane.isCommissioned()) { 
        return validPlane; 
       } 
      } 
     } 
    } 

私は確信しているが、このような場合に対処するためのいくつかのデザインパターンがあります。 if-elseに対するより洗練されたアプローチを理解する必要があります。

答えて

2

あなたがここにいるのは、戦略パターンで、hereです。

コンストラクタ内のPlaneServiceにプレーンを添付しているため、planeIdをメソッドに渡す必要はありません。つまり、プレーンなしのサービスはありません。プレーンにplaneIdがあると仮定します。

コンパイル時に実装がバインドされないようにするには、bridgeパターンを使用する必要があります。多かれ少なかれ同じですが、構造的な目的のために使用し、デレーターをコンストラクターではなくセッターメソッドで渡します。

+0

[いいえ答えを書くには?](http://stackoverflow.com/help/how-to-answer):[...] ***リンクのコンテキストを提供する*** - *外部のリソースが奨励されますが、あなたの仲間のユーザーが何であるか、なぜそれがあるのか​​を知るために、リンクの周りに文脈を追加してください。*** ***重要なリンクの最も関連性の高い部分を常に引用します。 *** [...] – BackSlash

+0

最初に質問に答えて編集する方法、これは私が推測するより良いガイドです! – ddarellis

2

次の例のように、プレーンクラスにvalidateメソッドを定義することができます。

class Plane { 
     private int _planeId;  
     public boolean validate(){ 
      return false; 
     } 
     public int getModel() { } 
    } 

、その後、子クラスでは、あなたがvalidateメソッドの動作をオーバーライドすることができた:

class FigherJet extends Plane { 
     public boolean isCommissioned() {} 

    @Override 
    public boolean validate() { 
     return isComissioned(); 
    } 
} 

class PassengerPlane extends Plane { 
    public int getNumberOfPassengers() {} 
    @Override 
    public boolean validate(){ 
     //if plane.getNumberOfPassengers() is 100 to 300, return true, else return false 
    } 
} 

そして、あなたの飛行機サービスは、子オブジェクトのいずれかでvalidate()メソッドを呼び出すことができます。

public boolean validatePlane(int planeId) { 
     //fetch passenger plane from planeId from db. 
     if (passengerPlane != null) { 
      return passengerPlane.validate(); 
     } 
    } 
2

この場合もVisitorのパターンを使用することができます。このようにして

class Plane { 
     private int _planeId;  

     public int getModel() { } 

     abstract boolean validateWith(PlaneValidator validator); 
    } 

    class PassengerPlane extends Plane { 
     public int getNumberOfPassengers() {} 

     boolean validateWith(PlaneValidator validator) { 
     return validator.validate(this); 
     } 
    } 

    class FigherJet extends Plane { 
     public boolean isCommissioned() {} 

     boolean validateWith(PlaneValidator validator) { 
     return validator.validate(this); 
     } 
    } 

    class PlaneService implements PlaneValidator { 
     ... 
     boolean validatePlane(int planeId) { 
     //fetch Plane object from db 
     return plane.validateWith(this); 
     } 

     //Methods implemented from PlaneValidator 
     @Override 
     boolean validate(FighterJet plane) { 
     return plane.isCommissioned(); 
     } 

     @Override 
     boolean validate(PassengerPlane plane) { 
     return plane.getNumberOfPassengers() in range(100, 300); 
     } 
    } 

、あなたは簡単に新しい種類を使用してシステムを拡張することができ、あなたがする必要があるすべてのものは、派生型でvalidateWith(PlaneValidator)メソッドをオーバーライドしてPlaneValidatorに適切なメソッドを追加して実装された方法でその動作を記述しています。私はあなたのシステムに適用可能なパターンであるかどうかはわかりませんが、私にとってはそれは可能性があります。

関連する問題