Другой подход заключается в перемещении отношений из рассматриваемых объектов. Много раз ни А, ни В никогда не должны знать друг о друге; это использование кода, который находит эти свойства удобными. Именно здесь могут вступать в игру графики или двунаправленные карты.
Двунаправленные карты можно легко использовать для отслеживания отношений один к одному. Графики могут быть намного лучше в отслеживании других типов кардинальности (многие-к-одному, многие-ко-многим и т. Д.)
Существует несколько различных реализаций графа, которые могут помочь в этом. Я слышал, но никогда не использовал JGraphT, и есть один, который я часто использовал, это plexus (никакого отношения к контейнеру IOC). http://jgrapht.sourceforge.net/ и http://plexus.sf.net/ соответственно.
График хорош, потому что он обеспечивает полную гибкость в определении различных отношений, а двунаправленная связь поддерживается неявно.
Тот факт, что обеим сторонам отношений необходимо синхронизироваться, часто является признаком того, что сами отношения имеют одинаковую важность для конечных точек, а не то, что каждая сторона должна пытаться инкапсулировать.
Тем не менее, если родитель и потомок действительно do должны работать друг с другом, то один из подходов состоит в том, чтобы выяснить, что является первичным и можно ли все операции выполнять через этот объект. Так, например, в родительских дочерних отношениях могут быть выполнены дочерние операции над родителем, когда родитель передает ссылку на себя дочерним элементам во время этой операции. Я бы сказал, что если вы не можете, то это хороший показатель того, что некоторые линии необходимо перерисовать в дизайне.
Снова используя пример parent-child, я действительно не нашел случая, когда отношения parent-> child и child-> parent были настолько динамичны, что один конец не мог их контролировать. И в 99% случаев я держу обратную ссылку от вторичной к первичной, это для удобства и жизненный цикл отношений хорошо установлен.
... в противном случае я использую график.