Я пытаюсь сделать небольшой и простой графический интерфейс на C++ (с SDL). Я экспериментирую с шаблоном Composite, чтобы иметь гибкое решение.Нужен ли мне посетитель для моего компонента?
У меня есть класс Widget, с объектами Component: например, есть PaintingComponent; если я хочу нарисовать ящик, я буду использовать PaintingBoxComponent, который наследуется от PaintingComponent.
Идеальный класс Widget будет выглядеть немного так:
Class Widget
{
private:
vector<Component*> myComponents;
public:
// A small number of methods able to communicate with the component
// without knowing their types
}
Мой вопрос прост: что это лучший способ, чтобы активировать этот компонент, когда мне это нужно?
Сначала я пошел с функцией «display» в классе Widget. Но я вижу две проблемы:
1 °) Я теряю чистый полиморфизм «Compoonent» в Widget, так как я вынужден объявить конкретный компонент виджета как PaintingComponent. Я могу справиться с этим, так как логично, что виджет должен отображаться.
2 °) Более хлопотно, мне нужно передать информацию между моей основной программой и моим PaintingComponent. Либо я передаю экран SDL_Surface * в PaintingComponent, и он рисует изображение, на которое оно нарисовано, или я передаю моему компоненту ссылку на объект, который должен получить изображение, которое он нарисовал (и этот объект будет рисовать изображение на экран). В обоих случаях Widget должен будет обрабатывать данные и должен знать, что такое SDL_Surface *. Я теряю свободную связь, и я не хочу этого.
Затем я рассмотрел использование шаблона «Посетитель», но я не привык к нему, и, прежде чем попытаться его реализовать, я хотел бы получить ваш совет.
Как бы вы приступили к созданию гибкого и надежного решения в этом случае? Заранее спасибо !
Спасибо, мне удалось сделать это примерно так, как вы его описали. Но он меняет так много вещей в глобальной архитектуре, это немного озадачивает сначала. Теперь я должен понять, как использовать посетителя + виджет + виджет внутри виджетов! В любом случае, вы убедили меня: лучше иметь возможность менять графику позже. еще раз. – Raveline