Это не упражнение ООП - я имею в виду, сначала используйте логику, а затем посмотрите на паттерны.Направленные и неориентированные графы очень разные звери.Направленный край имеет начало и конец, а ненаправленный - только два узла.Вы можете назвать их началом и концом, чтобы получить общую базу, но нет такой вещи, как направленность , которая будет добавлена к ребру.
В то же время ребра могут иметь цвета, веса, цены, длина, вместимость и т. д. Вы действительно хотите реализовать ColoredWeightedPricedHavingLenghtCapacityLimitedEdge
?Или вы хотите использовать 5 декораторов?Надеюсь, вы этого не сделаете.
Мое первое замечание: «направленность» не вписывается ни в одну модель.Вы можете использовать атрибут isDirected или любой другой, и, возможно, он вам вообще не нужен, так как большинство графиков не смешивают разные виды ребер.Таким образом, один атрибут на Graph
должен делать.Довольно часто ненаправленное ребро представляется парой двух направленных.
Мое второе замечание заключается в том, что такие вещи, как вес, как правило, не должны принудительно вставляться в ребро.Использование Map<IEdge, Double>
в качестве свойства Graph
делает работу лучше.Вы по-прежнему можете использовать такие объекты, как Edge и Node, что исключает путаницу с ними (что может легко произойти в C, когда вы, вероятно, используете их id
s), но сохраняете их свойства внешними.