Шаблон дизайна посетителя с деревьями двоичных выражений - PullRequest
0 голосов
/ 02 октября 2019

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

Текущий код создает двоичное дерево выражений на основе массива символов (который является выражением), а затем обходит дерево в порядке префикса (используя метод перемещения в классе Tree, где также создается дерево)а затем оценивает выражение в классе «Калькулятор», который реализует интерфейс «IVisitor». Единственный метод, предоставленный для этого класса, - это метод посещения, который возвращает объект и нуждается в узле в качестве его параметра. В моем классе Node есть метод accept (с объектом IVisitor в качестве параметра), который должен взаимодействовать с методом посещения.

Я не совсем уверен, как эти части должны объединяться, и я наблюдалбесчисленное количество видео на YouTube пытается выяснить, как применить шаблон дизайна посетителей к этому.

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

Спасибо!

1 Ответ

0 голосов
/ 04 октября 2019

То, что я забыл, - это различные типы операторов (символ) и операнд (двойной). Как только я понял это, в методе visit () мы можем проверить, является ли узел оператором (внутренний узел), затем проверить, какой оператор (+, -, /, *), затем вызвать метод accept () слева иправые узлы (приводя оба к двойникам) с действительным оператором между ними.

Пример:

if (n.getContent() == (Object) '+')
        d = (Double) n.getLeft().accept(this) + (Double) n.getRight().accept(this);

d - переменная типа Double. Это будет вызываться до тех пор, пока мы не достигнем операнда (конечного узла), который мы проверяем в методе visit () следующим образом:

// If node has no children, we are at an operand (Double)
if (n.getLeft() == null && n.getRight() == null)
        return Double.parseDouble(n.getContent().toString());

Это вернет значение в исходный вызов accept () и добавитдва значения вместе в этом случае.

Ответ на сохранение для последующего использования.

...