Java类设计 - 图

问题描述:

我对Java相当陌生,我需要一些帮助来找出一个好的类层次结构和总体设计(我正在研究CS)。Java类设计 - 图

该任务与图论有关,因此我们被要求为2种类型的图形,简单图形和多图形(允许有平行边缘)以及相应的实现创建接口。

我想出了以下接口层次:

 
* Element 
    - Vertex 
    - Edge 
     + MultiEdge 
* Graph 
    - MultiGraph 

及其相应的实施方案。 现在我真的不想在这里讨论我的实际实现,我只是给我一些例子,因为(至少我是这么认为的),我设计整体思维的方式遇到了麻烦。

整个事情工作得很好,直到我需要扩展我的图形具有MultiGraph功能。下面是一个GraphImpl代码片段:

 
protected final List edges; 

public Graph addEdge(Edge e) { 
    List newEdges = new ArrayList<Edge>(); 
    newEdges.addAll(edges); 
    newEdges.add(e); 
    return new GraphImpl(vertices, newEdges); 
} 

正如你所看到的,我图形边缘<边缘>存储在一个列表,我GraphImpl,为此和我有很多的名单都在我的实现。另外,你可以看到我从addEdge返回了一个新的GraphImpl,因为GraphImpl应该是不可变的。

有了这个实现多图时,我遇到了很多麻烦,因为在这里,我需要交换名单<边缘>的列表<MultiEdge>。但是当我重新定义了MultiGraph中的“边缘”变量时,我认为GraphImpl中的方法仍然访问我在GraphImpl中定义的列表,因此如果我调用MultiGraph,则不会添加边缘,直到为MultiGraph完全重写为止。但后来我发现我不得不重写它,因为GraphImpl中的addEdge(自然地)返回一个GraphImpl,但在MultiGraphImpl中,我需要创建一个MultiGraphImpl。

我想明白的是,你将如何设计和实现这样的事情。我拥有的是一堆相互延伸的接口,以及相同的实现层次,也相互延伸。

Graph的功能只是MultiGraph的一个子集,因此GraphImpl中所做的一切大多数对MultiGraphImpl也是有效的。现在,我需要将大量代码从GraphImpl复制到MultiGraphImpl,只是为了克服类型问题(我至少在某种程度上可以理解,但我不知道如何绕过它们)。

我希望你现在不要太困惑,因为我确实是这样;)如果我在任何部分都不清楚,我会很乐意澄清,只是指出我缺少什么。

+1

不完全是,但它无论如何帮助,所以谢谢:) – fresskoma 2010-11-02 21:39:43

可能是你需要一个Composite Pattern在这里。它可以让你以类似的方式处理单个和多个对象。也许这可以帮助你的设计。

这是一本非常完整的数据结构,由Goodrich/Tamassia为Java书中的数据结构和算法设计。

给它一个试试吧:http://net3.datastructures.net/

而且,是的,我不支持多图形,我需要