我应该如何建模类之间的关联

时间:2010-03-09 23:14:18

标签: java associations modeling

我正在为我的应用程序中的域模型建模。显然,一些对象关系是关联,但这些关联也有属性。例如:

Foo可以拥有一对多的条形图。但是,关联具有属性,例如该关联有效的日期范围。所以,我这样做的方式如下:

public interface Association<S, T> {
     public S getSource();

     public T getTarget();
}

然后对于类似上面的内容:

public class FooToBarAssociation implements Association<Foo, Bar> {
    public Foo getSource();
    public Bar getTarget();
    public Date getFromDate();
    public Date getToDate();
}

然后Foo类有:

private List<FooToBarAssociation> associations;

我的问题是:

  1. 这是建模与属性关联的合适方式吗?

  2. 业务逻辑应该在哪里添加/删除与Foo的关联?创建FooToBarAssociation有时需要一些业务逻辑,我想知道是否应该在FooService中处理,然后调用setAssociations而不是在模型对象中。我一直听说尽可能地将商业逻辑排除在模型对象之外。

2 个答案:

答案 0 :(得分:0)

与您在UML中实现关联类时相同的规则适用。 你创建的是一种方式,其他可能是嵌套--Foo包含Assoc,而Assoc又包含Bar。您也可以在包含Assoc和Assoc的Bar的另一种方式创建它,包含Foo。 Foo可以包含Assoc和Bar可以包含Assoc。有很多可能性,它只取决于您的要求。 在您的示例中,您的解决方案很好 你听到的似乎很好,但有时它可能很复杂。

答案 1 :(得分:0)

您的问题的答案:

  1. 我认为你的模型是合适的。
  2. 在面向领域的模型中,我会将关联逻辑添加到Foo。
  3. 我有另一个建议,但它适用于特定情况。如果您需要模型一次只使用一个关联,则以下简化模型将起作用。

    public class Foo {
    
        private Date startDate;
        private Date endDate;
        private Bar bar;
    
        public Date getStartDate() {
            return startDate;
        }
    
        public Date getEndDate() {
            return endDate;
        }
    
        public Bar getBar() {
            return bar;
        }
    
    
    }
    

    其中开始日期和结束日期对应于条形与Foo关联的时间段。这样,即使Foo to Bar是一对多,你一次只能在一个Bar上工作。 Foo Bar关联将根据生效日期从数据库中提取,该生效日期位于开始日期和结束日期之间。