Java 处理数据库子类的最佳设计?
我有一个叫做Java 处理数据库子类的最佳设计?,java,oop,design-patterns,Java,Oop,Design Patterns,我有一个叫做平面的类 class Plane { private int _planeId; public int getModel() { } public int getNumberOfPassengers() {} } 我还有一个叫做PlaneService的类,它依赖于平面,并为它添加了一些逻辑 class PlaneService { private Plane _plane; public PlaneService(Plane _p
平面的类
class Plane {
private int _planeId;
public int getModel() { }
public int getNumberOfPassengers() {}
}
我还有一个叫做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() {}
}
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;
}
}
}
}
我的问题是如何以面向对象的方式最好地设计“PlaneSvc”?有好的设计模式吗
目前,我的代码如下所示:
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;
}
}
}
}
我相信有一些设计模式来处理这种情况。我需要了解一种更清晰的方法来处理if-else。这里的策略模式,您可以找到它
我不认为你应该把planeId传递给这个方法,因为你在构造函数中将一个平面附加到PlaneService上,这意味着没有平面的服务,我也假设这个平面中有planeId
如果希望实现在编译时不被绑定,那么应该使用模式。或多或少都是相同的,但您将其用于结构目的,并且您传递的委托者不是构造函数,而是setter方法。您可以在plane类中定义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();
}
}
你也可以在这个案例中使用patter
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
添加适当的方法,并在实现的方法中描述其行为。我不知道它的模式是否适用于您的系统,但对我来说,它可能是 :[…]为链接提供上下文-鼓励链接到外部资源,但请在链接周围添加上下文,以便您的其他用户了解它是什么以及它为什么存在。始终引用重要链接中最相关的部分,以防无法访问目标站点或永久脱机。[…]如何先回答问题,然后编辑,我想这是一个更好的指南!