Паттерны GoF - Composite (лекция)
Автор: Rageous
<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> Можно сразу к примерам?
<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