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

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

Автор:

<MiF> Bridge
<MiF> есть такой дядя Шаллоуей
<MiF> так вот, он студиозам по паттернам курсы ведет
<MiF> так там у него понтовый подход
<MiF> типа дает задачу, они сами проектируют и приходят к паттерну
<MiF> и первым делом это бридж :)
<MiF> Короче Bridge
<MiF> Назначение - отделить абстракцию от ее реализации так, чтобы и то и другое можно было независимо изменять
<MiF> Применять когда:
<MiF> 1. Нужно избежать привязки абстракции к реализации, например когда реализацию нужно выбирать в runtime
<MiF> 2. и абстракции и реализации должны расширяться потомками. В этом случае можно комбинировать разные абстракции и реализации и изменять их независимо
<MiF> 3. Изменение в реализации не должно сказываться на клиентах, их код вообще не должен этого почуять (no rebuild :)
<MiF> 4. хочется полностью скрыть реализацию от клиентов
<MiF> 5. нужно разделить одну реализацию между несколькими объектами и это нужно скрыть от клиентов
<MiF> Участники:
<MiF> 1. Abstraction - абстракция. Определяет интерфейс абстракции, хранит ссылку на Implementor'а
<MiF> 2. RefinedAbstraction - уточненная абстракция, расширяет интерфейс, определенный в абстракции
<MiF> 3. Implementor - реализатор. Определяет интерфейс для классов реализации, который не обязан точно соответствовать интерфейсу Abstraction (может быть вообще другим)
<MiF> 4. ConcreteImplementor - конкретный реализатор
<MiF> Что в результате:
<MiF> 1. полное отделение реализации от интерфейса, в том числе можно задавать в runtime
<MiF> короче устраняются compile-time зависимости
<MiF> 2. повышается расширяемость, т.к. иерархии абстракций и реализаций можно менять независимо
<MiF> 3. полное скрытие реализации от клиентов
<MiF> Пример нужен :)
<Rageous> мне чего-то ничего в голову не приходит
<Rageous> какие у гоф приведены?
<MiF> окошки переносимые
<MiF> давай напишу абстрактный
<MiF> обсудим и родим реальный :)
<Rageous> реальный... я полагаю, что когда люди делают переключаемый режим рендеринга (д3д/огл/софт...) так или иначе приходится разделять абстрактный интерфейс и реализацию
<Rageous> сама реализация в таком случае, может являться фасадом или адаптером к существующему апи, но это не суть как важно
<DaGGeR> плагин
<DaGGeR> чем не пример
<Rageous> ну плагин - это очень широкое понятие
<Rageous> просто плагины могут расширять фукнциональность, а не только подменять существующую
<Rageous> так или иначе в случае моста должен происходить выбор реализации в рантайме
<Rageous> впрочем, насколько я понимаю, за исключением подключения плагинов, почти всегда можно сделать вместо моста несколько классов-наследников интерфейса
<Rageous> хотя это и не будет мостом, т.к. часть фич при этом теряется
<MiF> что-то я задумался
<MiF> над примером
<Rageous> давай я пример напишу?
<MiF> давай
<MiF> я пока подумаю
<Cote-Duke> привет вошедшим
<Rageous> почти дописал )
<MiF> у меня мозг отключился
<Rageous> http://www.everfall.com/paste/id.php?28yk01qcx4hr
<MiF> Rageous, ништяк
<Rageous> =)
<MiF> тема раскрыта в минимализме :)
<Rageous> слегка надумано, правда, ну да лана )
<Rageous> давай дальше?
<MiF> я бы закончил
<Rageous> окей
<MiF> спать хочется
<Rageous> давай тогда ) до завтра )
<Rageous> спасиб за лекцию
<MiF> завтра добьем остатки
<MiF> тебе спасибо
<MiF> Спокойной ночи всем
<DaGGeR> приятно, блин
<Rageous> сн
<DaGGeR> когда по русски рассказывают
<DaGGeR> а то гоф читать невозможно
<Rageous> :)))
<unkier> а с SmartKeyboardReader всё нармально ?
<Rageous> а что с ним?
<unkier> там KeyboardReader это типа конструктор неправильно названый ?
<DaGGeR> шаблон на странице 70 пример на странице 211, примечания на странице 31
<Rageous> аа.. ну да, сек
<Rageous> поправил, спасибо
<unkier> ok
<unkier> good night
<Rageous> сн

23 января 2006

Комментарии [1]