Мне нужен шаблон для построения деревьев объектов - PullRequest
0 голосов
/ 09 февраля 2011

У меня есть некоторый код (C #), который строит дерево полиморфных объектов. В зависимости от типа, объект может иметь 0-7 детей. Прямо сейчас конструкторы объектов ничего не делают, и я создаю все дерево объектов, используя рекурсивную вспомогательную функцию:

// pseudocode
void BuildTree(Node root) {
    if(root is A) {
        root.a_data = ...
        root.a_child = GenerateNewNode(some_constraints); 
        BuildTree(root.a_child)
    } else if(root is B) {
        // same stuff, for B.  Note B may have different chldren, etc
    }
}

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

О, еще один осложняющий фактор. В BuildTree есть вещи, которые зависят от более ранних вещей, которые BuildTree делал. Например, если я когда-либо генерировал B, то мне нужно сделать XYZ для C узлов. Или, если я в настоящее время генерирую дочерние элементы A, то не генерируйте D.

1 Ответ

0 голосов
/ 09 февраля 2011

Звучит так, как будто вам нужно прикрепить полиморфный метод к каждому узлу, чтобы каждый узел мог строить сам.

public class Node
{
    public virtual BuildNode(IBuildStrategy strategy)
    {
    }
}

Таким образом, вы можете просто позвонить

root.BuildNode(new InitialNodeBuildingStrategy());

для заполнения дерева, в то же время позволяя использовать собственные стратегии в поддеревьях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...