Нужен ли посетитель для моего компонента? - PullRequest
0 голосов
/ 24 сентября 2010

Я пытаюсь сделать небольшой и простой графический интерфейс на C ++ (с SDL).Я экспериментирую с составным шаблоном, чтобы иметь гибкое решение.

У меня есть класс 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 Ответ

1 голос
/ 24 сентября 2010

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

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