处理数据库子类的最佳设计?

时间:2016-12-29 22:24:22

标签: java oop design-patterns

我有一个名为class Plane { private int _planeId; public int getModel() { } public int getNumberOfPassengers() {} } 的班级。

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.
   }
}

另一个名为PlaneService的类依赖于平面并为其添加了一些逻辑,

   class Plane {
       private int _planeId;      

       public int getModel() { }
    }

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

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

但是现在出现了一个新的要求:必须扩展飞机以支持战斗机。所以新设计看起来像这样:

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;
                } 
            }
       }
    }

我的问题是如何以OOP方式最好地设计PlaneSvc?有一个好的设计模式吗?

目前,我的代码如下所示:

{{1}}

我确信有一些设计模式可以处理这种情况。我需要了解if-else的更清洁方法。

3 个答案:

答案 0 :(得分:2)

您在此处拥有的是策略模式,您可以找到它here

我不应该将planeId传递给方法,因为你已经在构造函数中将Plane连接到PlaneService,这意味着没有平面的服务,我也假设平面中有planeId。

如果您希望在编译时不要绑定实现,则应使用bridge模式。或多或少是相同的,但是你将它用于结构性的purpuses,而不是在构造函数中传递委托者,而是使用setter方法。

答案 1 :(得分:2)

您可以在平面类中定义验证方法,例如:

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 :(得分:2)

您也可以在这种情况下使用Visitor模式。

df1 = pd.concat([df.loc['x_data'],df.loc['y_data']],keys=('x', 'y')).to_frame().sort_index(1)
df1.index = ['_'.join(x) for x in df1.index]
print (df1.T)
   x_sec01  y_sec01  x_sec02  y_sec02  x_sec03  y_sec03  x_sec04  y_sec04  \
0      0.0      0.0      0.0      0.0      0.0      0.0      0.0      0.0   

   x_sec05  y_sec05    ...     x_sec12  y_sec12   x_sec13   y_sec13   x_sec14  \
0      0.0      0.0    ...         0.0      0.0  0.557336  3.212005  0.604719   

    y_sec14  x_sec15   y_sec15   x_sec16   y_sec16  
0  2.692938  0.73346  2.650384  1.019466  3.085967  

[1 rows x 32 columns]

通过这种方式,您可以使用新类型轻松扩展系统,您需要做的就是在派生类型中覆盖 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)添加适当的方法并描述其在实现中的行为方法。我不知道它是适用于您的系统的模式,但对我来说看起来可能是。