Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 处理数据库子类的最佳设计?_Java_Oop_Design Patterns - Fatal编程技术网

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
添加适当的方法,并在实现的方法中描述其行为。我不知道它的模式是否适用于您的系统,但对我来说,它可能是

:[…]为链接提供上下文-鼓励链接到外部资源,但请在链接周围添加上下文,以便您的其他用户了解它是什么以及它为什么存在。始终引用重要链接中最相关的部分,以防无法访问目标站点或永久脱机。[…]如何先回答问题,然后编辑,我想这是一个更好的指南!