2

我正在使用 Play 2 在 Java 中构建应用程序。我正在对不同类别的人进行建模,每个人与与应用程序流程相关的其他一些类具有不同的关系。每个Application都有一个Signatory、一个CertificateHolder和一个EnrolmentOfficer

我意识到,由于一个人可能是这些事物中的任何一个或全部,因此将信息存储三遍是多余的。所以一些重构是有序的!

我决定创建一个类,通过对象组合存储 、 和 类中的Person每一个。然后我可以使用符号访问它们的任何属性。SignatoryCertificateHolderEnrolmentOfficerperson.signatory.

我想知道的是:由于三个专门的类在 a 之外不存在Person,我会更好地使用内部类来实现我的目标吗?我的意思是这样的:

public class Person {

    public class Signatory {
        // Signatory fields go here
    }

    public class CertificateHolder {
        // CertificateHolder fields go here
    }

    public class EnrolmentOfficer {
        // EnrolmentOfficer fields go here
    }

    // More general Person code goes here
}

这似乎消除了我在数据库中为每个SignatoryCertificateHolder和存储单独实体的需要EnrolmentOfficer,但我不确定ebean是否可以正确地将这个设计转换为数据库模式。

哪种方法更适合我的目的?

编辑:内部类方法不起作用;它与 ebean 处理关系的方式不兼容。我要请版主删除这个话题。

4

2 回答 2

2

您可以/应该使用继承,因为 、 和 IS-A Person 中的每Signatory一个CertificateHolder以及EnrolmentOfficerperson 的字段在派生自它的 oll 类中都很常见。课程应该是:

class Signatory extends Person{
...
}


class CertifiedHolder extends Person{
...
}


class EnlormentOfficer extends Person{
...
}

如果您使用 Hibernate/JPA,您可以在实体上应用继承,从而在数据库表上应用继承:看看Entity Inheritance

关于您的评论,您可以让一个类也从您的子类派生,从而“组合”这两个功能。

于 2013-08-07T14:24:00.540 回答
1

在这种情况下,您可以使用接口从SignatoryEnrollment中提取独特的行为:

public interface Signatory
{
 //signatory methods only
}

public interface Enrolment
{
  //enrolment methods only
}

然后

public class EnrolmentPerson extends Person implements Enrolment
{
}

public class SignatoryPerson extends Person implements Enrolment
{
}

这个想法是使用接口过滤常见行为。

或者您可以尝试使用装饰器模式来装饰您的 Person 模型?这将允许您在一个保护伞下递归地“链接”人的行为。许多java.io类都是以这种方式“装饰”的。 http://en.wikipedia.org/wiki/Decorator_pattern

示例(我没有测试它):

public interface Person
{
  public void doSomething();
}

public class SimplePerson implements Person
{
 public void doSomething()
 {
   System.out.println("normal person doing things");
 }
}

public abstract class PersonDecorator implements Person
{ 
  Person decoratedPerson;

  public PersonDecorator(Person decoratedPerson)
  {
    this.decoratedPerson = decoratedPerson;
  }

  public void doSomething()
  {
   decoratedPerson.doSomething();
  }
}

public class EnrolmentPerson extends PersonDecorator
{
  public EnrolmentPerson(Person decoratedPerson)
  {
     super(decoratedPerson);
  }

  public void doSomething()
  {
    super.doSomething();
    this.doEnrolmentSomething();
  }

  public void doEnrolmentSomething()
  {
    System.out.println("enrolment person doing something");
  }
}

希望能帮助到你!

于 2013-08-07T14:28:42.940 回答