Паттерны GoF - Adapter (лекция)
Автор: Rageous
<MiF> Adapter
<MiF> Назначение - преобразует интерфейс одного класса в интерфейс другого, который нужен клиентам. Обеспечивает работу классов с несовместимыми интерфейсами
<MiF> Короче это классический Wrapper
<MiF> Надо было с него и начать :)
<MiF> а потом декоратора
<MiF> ну да ладно
<MiF> Применять когда:
<MiF> 1. хочется использоваться класс, но его интерфейс не соответствует вашим потребностям
<MiF> 2. собираетесь создать повторно используемый класс, который в последствии должен взаимодействовать с объектами (заранее не известными) с несовместимыми интерфейсами
<MiF> 3. есть несколько потомков, но их интерфейс адаптировать путем порождения потомков от каждого неудобно, тогда можно адаптировать интерфейс их общего родительского класса
<MiF> Короче адаптеры бывают двух типов
<MiF> Адаптеры классов и адаптеры объектов
<MiF> Потом разрулим разницу
<MiF> Участники:
<MiF> 1. Target - цель, определяет интерфейс, которым пользуется клиент
<MiF> 2. Client - использует объекты с интерфейсом Target
<MiF> 3. Adaptee - адаптируемый, определяет существующий интерфейс, который нужно адаптировать
<MiF> 4. Adapter - адаптирует интерфейс Adaptee к интерфейсу Target
<MiF> Результаты для адаптера классов:
<MiF> 1. адаптирует Adaptee к Target перепоручая действия конкретному классу Adaptee, то есть паттерн не работает, если мы хотим сразу адаптировать класс и его подклассы
<MiF> 2. Позволяет Adapter'у замещать операции адптируемого
<MiF> 3. Вводит только один новый объект, для того чтобы добраться до адаптируемого не нужно дополнительного обращения к указателю
<MiF> Адаптер объектов:
<MiF> 1. Позволяет одному Adapter'у работать со многими объектами Adaptee, то есть с самим Adaptee и его потомками. Можно добавить новую функциональность сразу всем адаптируемым объектам
<MiF> 2. Замещение операция Adaptee затруднительно, для этого нужно породить подкласс от Adaptee и заставить Adapter ссылатсья на него
<MiF> нужно пример
<MiF> адаптера класса и адаптера объекта
<Rageous> хм...
<Zeux> А обертка над 3d-API - это какой паттерн?
<Rageous> адаптер
<Zeux> вообще над любым API
<MiF> адаптер
<Zeux> ну вот
<MiF> :)
<Zeux> :)
<MiF> пояснить разницу надо
<MiF> между адаптером класса и объекта
<MiF> пойду писать
<Rageous> угу
<MiF> http://www.everfall.com/paste/id.php?lhh6iyjbbnuo
<MiF> адаптер класса
<MiF> сейчас будет адаптер объекта
<MiF> потом сравним минусы и плюсы
<Rageous> кстати, враппер - это не совсем адаптер. враппер динамически расширяет интерфейс объекта, а адаптер трансформирует оригинальный интерфейс (т.е. от оригинального интерфейса может вообще ничего не остаться)
<Rageous> (это я к тому, что в начале писали)
<MiF> http://www.everfall.com/paste/id.php?6164fzo15dkc
<MiF> да, похоже что так, но врапером называют все подряд :)
<MiF> короче смотрим в код
<Rageous> угу, все понятно
<MiF> на первый взгляд одна фигня
<Rageous> не, не одна
<Rageous> :)
<MiF> только вызов метода в объектном адаптере требует еще обращения к указателю
<MiF> но на самом деле все круче
<MiF> допустим, что Adaptee - интерфейс
<MiF> и у него вагон потомков
<MiF> вопрос - как адаптировать его адаптером класса?
<Rageous> никак
<MiF> ответ - никак
<MiF> :)
<MiF> кучу адаптеров нужно делать
<MiF> что ацтой
<Rageous> лучше себя убить )
<Rageous> чем такую кучу )
<MiF> с адаптером объекта ничего не надо
<MiF> минус - обращение к указателю
<MiF> считай по цене = virtual cast
<MiF> а не обычному
<MiF> короче для простых классов может быть критично
<MiF> а так - фигня
<MiF> Вот собственно все
<MiF> вопросы есть?
<Rageous> для простых зачастую лучше сам класс переписать, чем адапторы делать
<Rageous> неа
23 января 2006