2010-10-14 2 views
2

Я довольно новичок в Java, и мне нужна помощь в определении хорошей иерархии классов и общего дизайна для заданий, которые мы получили (я изучаю CS).Java Class Design - Graphs

Назначение связано с теорией графов, поэтому нам было предложено создать интерфейсы для двух типов графиков, простых графиков и мультиграфов (которым разрешено иметь параллельные ребра) и соответствующей реализации.

я придумал следующую иерархию интерфейса:

 
* 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, и для этого, у меня есть много этих списков по всей моей реализации. Кроме того, вы можете видеть, что я возвращаю новый GraphImpl из addEdge, поскольку GraphImpl должен быть неизменным.

С этим я столкнулся с множеством проблем при реализации мультиграф, потому что здесь, мне нужно, чтобы обменять список < Грань > для списка <MultiEdge>. Но когда я переопределял переменную «edge» в MultiGraph, я думаю, что методы в GraphImpl по-прежнему обращались к списку, определенному в GraphImpl, так что ребра не добавлялись бы, если бы я вызвал MultiGraph, пока полностью не переписал его для MultiGraph. Но позже я заметил, что мне все равно пришлось бы переписать его, потому что addEdge в GraphImpl возвращает (естественно) GraphImpl, но в MultiGraphImpl мне понадобилось бы создание MultiGraphImpl.

То, что я пытаюсь понять, заключается в том, как бы вы проектировали и реализовали такую ​​вещь. У меня есть множество интерфейсов, расширяющих друг друга, и одна и та же иерархия реализаций, также расширяющих друг друга.

Функциональность Graph - это всего лишь подмножество MultiGraph, поэтому все, что делается в GraphImpl, в основном также применимо для MultiGraphImpl. Прямо сейчас мне нужно было скопировать много кода из GraphImpl в MultiGraphImpl, чтобы преодолеть проблемы типа (которые я, по крайней мере, так или иначе понимаю, но я не знаю, как их обойти).

Надеюсь, вы уже не слишком смущены, потому что я определенно есть;) Если бы я был неясен ни в какой части, я буду рад прояснить, просто укажите мне на недостающие.

ответ

1

Может быть, вам нужен Composite Pattern здесь. Он позволяет обрабатывать одиночные и несколько объектов аналогичным образом. Возможно, это поможет вашему дизайну.

0

Это очень полные структуры данных, разработанные Гудричем/Тамассией для книги «Структуры данных и алгоритмы на Java».

Дайте ему попробовать: http://net3.datastructures.net/

И, да, я действительно поддерживает мульти-граф