我有一个名为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的更清洁方法。
答案 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)
添加适当的方法并描述其在实现中的行为方法。我不知道它是适用于您的系统的模式,但对我来说看起来可能是。