Составной шаблон: Копировать древовидную структуру

Я реализовал базовую структуру составного шаблона, имеющую три класса:

class Component
{
};

class Leaf : public Component
{
};

class Composite : public Component
{
vector<Component> Leaves;
};

Кроме того, у меня есть другой класс ComponentCollection в качестве контейнера компонентов. Все эти классы имеют соответствующий класс, отвечающий за создание графического представления:

class GraphicComponent;
class GraphicLeaf;
class GraphicComposite;
class GraphicComponentCollection;

Из заданной древовидной структуры, состоящей из различных объектов-компонентов, я хочу создать соответствующие объекты графического представления, начиная с абстрактного метода:

createGraphicRepresentations(Component a_Component);

Есть ли элегантный способ создания либо GraphicLeaf, либо GraphicComposite в зависимости от a_Component, избегая при этом проверки типов?

0

Решение

Вы можете делегировать создание графического компонента обратно исходному компоненту:

class Component {

GraphicComponent create();
}

Таким образом, вы можете реализовать деревообследующий, который затем вызывает create для каждого компонента. Это один из способов. Другой способ заключается в реализации шаблон посетителя. С шаблоном посетитель ваш код будет выглядеть примерно так:

interface IComponentVisitor {

void visit(Component component);
void visit(OtherComponent component);
}

class Component {
void accept(IComponentVisitor visitor) {
visitor.visit(this);
}
}

Затем конкретный посетитель реализует посетителя и создает соответствующие компоненты.

class GraphicsVisitor {
void visit(Component compoennt) {
}
void visit(OtherComponent component) {
graphisComponent.add(new OtherGraphicsComponent());
}
}
1

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector