2010-09-24 1 views
0

Я пытаюсь сделать небольшой и простой графический интерфейс на 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 *. Я теряю свободную связь, и я не хочу этого.

Затем я рассмотрел использование шаблона «Посетитель», но я не привык к нему, и, прежде чем попытаться его реализовать, я хотел бы получить ваш совет.

Как бы вы приступили к созданию гибкого и надежного решения в этом случае? Заранее спасибо !

ответ

1

Если вы планируете позже изменить графическую систему, вы можете реализовать этот шаблон. Посетитель переходит к корневому узлу, а затем рекурсивно ко всем дочерним элементам, рисуя их на какой-либо поверхности (известный только самому посетителю). Вы можете собрать «список отображения» с этим, а затем оптимизировать его перед рисованием (например, в OpenGL применить z-сортировку (сначала нижний z).

+0

Спасибо, мне удалось сделать это примерно так, как вы его описали. Но он меняет так много вещей в глобальной архитектуре, это немного озадачивает сначала. Теперь я должен понять, как использовать посетителя + виджет + виджет внутри виджетов! В любом случае, вы убедили меня: лучше иметь возможность менять графику позже. еще раз. – Raveline