Разработка программного обеспечения Java: создание общего дерева - библиотека печати - PullRequest
0 голосов
/ 09 октября 2018

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

Алгоритм вычисления макета требует, чтобы я сделал обход дерева по порядку / предварительному заказу / после заказа по дереву.В моем проекте я собираюсь написать методы, подобные следующим:

class MyBinaryTreePrinterProject{

public void inOrderTraversal(Object root){
    // do inorder traversal
}

public void preOrderTraversal(Object root){
    // do preorder traversal
}

public void postOrderTraversal(Object root){
    // do postorder traversal
}
}

Корневой узел передается как объект, потому что двоичное дерево может быть определено в каком-то другом внешнем проекте со своим собственным пользовательским классом.определение.Например, следующие два проекта имеют свои собственные определения класса для представления двоичного дерева:

// Tree definition in some unrelated Project A
class ProjectATreeNode{
public ProjectATreeNode left;
public ProjectATreeNode right;
...
}

// Tree definition in some unrelated Project B
class ProjectBTreeNode{
public ProjectBTreeNode leftChild;
public ProjectBTreeNode rightChild;
...
}

Как методы в классе MyBinaryTreePrinterProject узнают о структуре предоставляемого двоичного дерева?Например, двоичное дерево из проекта A имеет поле с именем left для доступа к левому дочернему элементу, в то время как Project B называет его leftChild.Сначала я думал использовать Java Reflection (наряду с запросом пользователя предоставить имена полей для доступа к левым / правым дочерним элементам), но я не уверен, что это правильный путь.

Делает лучшедизайн существует?

1 Ответ

0 голосов
/ 09 октября 2018

Вы должны предоставить интерфейс MyBinaryTree, и клиенты должны будут реализовать этот интерфейс.

В этом случае может быть

interface MyBinaryTree {
    MyBinaryTree getRoot();
    MyBinaryTree getParent();
    MyBinaryTree getLeft();
    MyBinaryTree getRight();
}

Клиенты будут

class TreeA implements MyBinaryTree {
    MyBinaryTree getRoot()
    {//do stuff}
    MyBinaryTree getParent()
    {//do stuff}
    MyBinaryTree getLeft()
    {//do stuff}
    MyBinaryTree getRight();
    {//do stuff}
}
...