类图中的组合关系可以有循环吗?

时间:2014-11-11 04:33:55

标签: java class-diagram

我想为Java类图实现模型检查器。

我已经考虑了很多限制因素。

希望任何人都能帮助我解决这个问题。

我所说的所有周期都是只有一种关系的纯循环。

Q1:假设A类由B类组成,B类是否也可能由A类组成,因为A类和B类是不同的类?此外,组合关系是否有可能具有循环?

Q2:类图中的其他关系如聚合,依赖和关联怎么样?这些关系中循环的含义是什么?谁能举一些例子?

感谢您阅读我的问题并希望有人可以帮助我。

1 个答案:

答案 0 :(得分:1)

  

Q1:假设A类由B类组成,那么该类是否可能   鉴于A类和B类,B也由A类组成   不同的班级?而且,组合物是否可能   有周期的关系?

严格地说,用UML术语......是的,但你很难在代码中实际实现它。如果你问自己," B可以独立而没有A?"并且" A可以独立而没有B?"如果你可以同时对这两个人回答“否”,那么你们可以有两个由彼此组成的类。因为一个人必须能够独立站立而另一个人才能由它组成,所以你不能同时拥有它们。然而,由于构图与聚合主要基于设计和背景,因此并非完全不可能。例如,你可以这样:

班级B包含对A的引用,A包含对B的引用

public class A {
    B myB;
    String name = "A";

    public A(int num) {
        this.name += num;
    }

    public void setMyB(B b) {
        this.myB = b;
    }

    public B getMyB() {
        return this.myB;
    }

    public String getName() {
        return this.name;
    }
}

public class B {
    A myA;

    String name = "B";
    public B(int num) {
        this.name += num;
        myA = new A(num);
    }

    public A getMyA() {
        return this.myA;
    }

    public String getName() {
        return this.name;
    }
}

在此示例中,我们使用已定义的String为该类提供标识符,然后为其附加一个数字,以显示一些唯一ID。 我们提供的方法允许我们访问AB个引用,但只有B通过构造函数(组合)创建对另一个的引用。

使用这个简单的测试:

public class Test {
    public static void main(String[] args) {
        A myA = new A(1);
        B myB = new B(2);

        B anotherB = new B(3);

        myA.setMyB(anotherB);

        System.out.println("A = " + myA.getName());
        System.out.println("A's B = " + myA.getMyB().getName());

        System.out.println("B = " + myB.getName());
        System.out.println("B'a A = " + myB.getMyA().getName());
    }
}

我们可以看到以下输出

A = A1
A's B = B3
B = B2
B'a A = A2

在此示例中,A中的B引用是在A的上下文之外创建的,并作为参数传入。如果我们删除了myB,我们就会失去对其A的引用,但如果我们删除myA(我们仍然有anotherB,则不会。{/ p>

假设我们从setMyB()中删除了A方法并将其移至构造函数中...我们有一个无限循环的新对象,并且您最终会得到一个StackOverflowError

你可能会变得有创意并试图实现Singleton模式或一些限制创建的对象数量的其他构造,但这样做意味着构造函数需要是私有/隐藏的,这会阻止其他类的扩展。使用静态字段来跟踪创建的数量可能会阻止错误,但是如果没有地方跟踪它们,您将失去所有引用,最后,您永远不会有#&# 34;完美"组成,因为一个类会缺少它的组件。

毕竟这"分析"你最终会想出一个有意义的设计,而不是一个严格适合在UML图上绘制的设计。 UML图表用于传达"关系"课间。 "独特"如果您在这里询问A使用哪个B和B使用A可能不会通过UML建模解决,但可能需要其他一些设计工作。

  

Q2:类图中的其他关系怎么样,比如   聚合,依赖和关联?什么是周期的意义   在这些关系?谁能举一些例子?

关联关系实际上用于描述由组合,聚合,多对多,一对一等定义的关系类型,并且取决于上下文。每个关联中循环的含义取决于你的设计。

通常,依赖中的循环意味着类依赖于自身。这可以用于递归函数调用,Singleton设计模式实现,或者需要类引用自身的一些其他设计模式。

上面已经回答了聚合。它基本上意味着对象"使用"不管它是什么聚合的。一个示例是Company聚合People。当公司离开时,人们仍然存在。这种关系中的循环类似于我的示例中显示的循环,除了您对AB类的外部引用,这些类作为前两个引用的参数传递到AB

底线是...... UML是一种显示类之间关系的工具。设计和实施将遵循这一点,并且事实上你有"有趣的"用UML建模的关系不会帮助你克服严重的设计障碍。

希望这有助于解释您的问题。