Я реализовал базовую структуру составного шаблона, имеющую три класса:
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, избегая при этом проверки типов?
Вы можете делегировать создание графического компонента обратно исходному компоненту:
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());
}
}