2010-05-17 3 views
3

Я разрабатываю GUI (графический интерфейс пользователя) для игрового движка (C++).Архитектура системы GUI?

Идея заключается в создании иерархии графических интерфейсов, таких как Focusable, Hoverable, Dragable и т. Д. Каждый компонент GUI может подключать несколько контроллеров, они изменяют поведение компонента.

Я думаю, что это дает гибкую систему и защищает от дублирования кода. Различные экземпляры одного и того же GUI-класса могут иметь разные сложные поведения (возможно, даже изменить их динамически), поэтому этот подход выглядит практичным.

Другой выбор - добавить сфокусированные, зависающие, перетаскиваемые и т. Д. Флаги в базовый компонент компонента GUI. Это похоже на накладные расходы, а не на гибкость.

Другим решением является использование декоратора и обертка объектов с помощью FocusDecorator, HoverDecorator и т. Д. Поддержание такой системы выглядит немного сложнее.

Вопрос: Что такое подводные камни в моем решении? Может быть, вы видели лучшие подходы в системах GUI? Каковы наилучшие способы реализации такой гибкой сложной системы?

+0

Вы даете три решения, а затем спросите, каковы подводные камни в вашем решении - о чем вы спрашиваете, или вы хотите изучить профессию 3x3? –

+0

Внимательно прочитайте вопрос. Я даю свое решение и две альтернативы. –

+1

Нет, вы даете «идею», выбор и другое решение. –

ответ

0

Ваше решение неплохое, если честно, я думаю, что это именно то, о чем идет дизайн шаблона Decorator, однако на C++ у вас лучшие методы реализации. Вы можете легко использовать дизайн на основе политик для создания класса шаблона компонента GUI и добавления классов признаков поведения компонента в качестве своих аргументов, а затем наследовать от аргументов.

+1

Спасибо, в большинстве случаев предпочтительнее создание шаблонов на основе шаблонов. Но может быть построена на основе скриптов. Компоненты GUI могут стать более гибкими с помощью этой динамической (a la multi-pimpl) реализации. –

0

Почему бы не решить проблему изменения поведения компонентов с помощью шаблона «Стратегия»?

+0

Компонент GUI может быть сфокусирован и зависает одновременно или только сфокусирован или только виден. Другой можно просто потащить. Похоже, что компонент GUI может иметь много стратегий в одно и то же время. Или, по крайней мере, одна композитная стратегия. –

+0

Из того, что вы говорите, мне кажется, что у вас есть два источника изменения поведения: как обрабатывается пользовательский ввод и как виджет фактически представлен на экране. Вы предвидите, что у вас одновременно будут комбинации стратегий для обоих аспектов? – miquelramirez

+0

Да, контроллер (аспект) отражает как обработку ввода, так и просмотр. Код клиента выглядит так: component.addController (focusable); ... focusable имеет слоты и подключается к сигналам компонента onKeyUp, onPaint и т. д. –