Архитектура движка.Статьи

Паттерны GoF - Composite (лекция)

Автор:

<MiF> Composite
<MiF> Назначение - компоновка объектов в дерево для представления иерархий, позволяет клиентам трактовать составные и индивидуальные объекты одинаково
<MiF> Применять когда:
<MiF> 1. Нужно представить иерархию объектов вида часть-целое
<MiF> 2. Нужна одинаковая трактовка составных и индивидуальных объектов
<MiF> Участники:
<MiF> 1. Component - компонент, определяет интерфейс для компонуемых объектов, реализует реализацию операция по умолчанию, общую для всех классов
<MiF> + Представляет интерфейс для доступа к потомкам и их управлением, и возможно определяет интерфейс для доступа к родителю и его реализацию
<MiF> 2. Leaf - лист, представляет листовые узлы композиции и не имеет потомков. Реализует интерфейс не составных объектов
<MiF> 3. Composite - составной объект. Реализует поведение составных компонентов, и операции по управлению потомками
<MiF> 4. Client - манипулирует всем через интерфейс Component
<MiF> Плюсы понятны :)
<MiF> Можно сразу к примерам?

  • MiF sets mode: -m
  • <kas> не, давай плюсы
    <kas> и минусы
    <MiF> Что имеем:
    <MiF> 1. клиент может ебиннобразно работать что с составными, что с индивидуальными объектами, что упрощает его код
    <MiF> 2. Новые компоненты добавить легко, они будут работать с клиентским кодом без его изменения
    <MiF> Минусы: нет строгой типизации, с этим возможны проблемы
    <MiF> Когда например какому-то составному нельзя добавить какой-то простой, отрулить это сложно
    <MiF> Примеры
    <MiF> простой SceneGraph - пример паттерна Composite
    <MiF> Вопросы есть?
    <MiF> примеры другие нужны?
    <kas> нужны
    <Rageous> недавно мы тут рассматривали цепочку отвественности
    <Rageous> иногда хочется из цепочки сделать дерево
    <Rageous> в этом нам может помочь Composite
    <MiF> применительно к gui?
    <Rageous> к гуи, к различным хендлерам событий - на самом деле везде, где порядок звеньев цепочки может быть не важен или не определен
    <Rageous> например, есть окно - у него чайлды
    <Rageous> а обработку клика мы рассчитывали делать как цепочку ответственности
    <Rageous> как только мы начинаем рассылать списку дочерних виджетов, мы получаем некое подобие Composite
    <MiF> Еще пример - шмотки из дьябло. Есть шмотки простые, есть те которые включают в себя артефакты, другие вещи. Составные вещи могут включаться в другие составные и т.д. Для клиента они трактуются одинаково. Можно это реализовать паттерном Composite
    <Rageous> т.к. уже не знаем: если я кину этому виджету событие, то съест он его сам? или это окно, инкапсулирующее кучу других виджетов?
    <Rageous> в случае с предметами будет интерфейс итема: скажем, получить вес
    <Zeux> которые в свою очередь могут тоже являться окнами..
    <Rageous> и будут наследники: предмет и композитный предмет
    <Rageous> композитный будет считать вес по своим детям, имеющим интерфейс итема
    <Rageous> сейчас код накидаю, сек
    <MiF> давай
    <Rageous> http://www.everfall.com/paste/id.php?hu9jg4a8dqpk
    <Rageous> для простоты паблики и вирт. деструкторы всякие опустил
    <Zeux> для конкретных игр, конечно, придется делать workaround-ы в стиле "нельзя делать контейнеры тройной вложенности" ну или ограничение по весу.
    <Rageous> да нет, не придется
    <Rageous> там все будет регулироваться правилами компоновки
    <Zeux> ну да.
    <Rageous> это не workaround-ы )
    <Zeux> но это и есть workaround-ы :)
    <Rageous> это логика )
    <Rageous> композитный итем - это база для создания сложных предметов. а его поведение регулируется игрой... но это не workaround - это нормальная ситуация
    <Zeux> ну, workaround - это логика :) ладно, это оффтоп какой-то
    <Rageous> угу )
    <MiF> по-моему все вполне ясно
    <MiF> идем дальше?
    <Rageous> угу
    <_NexiliaN_> только я непонел разницы меж этими классами
    <MiF> ?
    <_NexiliaN_> Item реализуется аналогичными CompisiteItem
    <Rageous> каким образом?
    <_NexiliaN_> просто в листе один елемент
    <Rageous> что это за элемент? )
    <Rageous> очередной композит? )
    <_NexiliaN_> Item в смысле :)
    <xmvlad> CompositeItem использует набор Item
    <xmvlad> в этом смысл :)
    <_NexiliaN_> а ну понел
    <xmvlad> то есть композит наследуется от общего интерфейса и сам же его использует для взаимодействия
    <xmvlad> с другими объектами общей иерархии
    <Rageous> больше вопросов нет?
    <MiF> Хороший пример - файловая система
    <MiF> ладно, поехали дальше

    22 января 2006