You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Паттерн Mediator<br />
Сложность операции WidgetChanged возрастает пропорционально сложности<br />
окна диалога. Создание очень больших диалоговых окон нежелательно и по<br />
другим причинам, но в других приложениях сложность посредника может свести<br />
на нет его преимущества.<br />
Известные применения<br />
И в ЕТ++ [WGM88], и в библиотеке классов THINK С [Sym93b] применяются<br />
похожие на нашего распорядителя объекты для осуществления посредничества<br />
между виджетами в диалоговых окнах.<br />
Архитектура приложения в Smalltalk/V для Windows основана на структуре<br />
посредника [LaL94]. В этой среде приложение состоит из окна Window, которое<br />
содержит набор панелей. В библиотеке есть несколько предопределенных объектов-панелей<br />
Рапе, например: TextPane, ListBox, Button и т.д. Их можно использовать<br />
без подклассов. Разработчик приложения порождает подклассы только<br />
от класса ViewManager (диспетчер видов), отвечающего за обмен информацией<br />
между панелями. ViewManager - это посредник, каждая панель «знает» своего<br />
диспетчера, который считается «владельцем» панели. Панели не ссылаются друг<br />
на друга напрямую.<br />
На изображенной диаграмме объектов показан мгновенный снимок работающего<br />
приложения.<br />
В Smalltalk/V для обмена информацией между объектами Рапе и ViewManager<br />
используется механизм событий. Панель генерирует событие для получения данных<br />
от своего посредника или для информирования его о чем-то важном. С каждым<br />
событием связан символ (например, #select), который однозначно его<br />
идентифицирует. Диспетчер видов регистрирует вместе с панелью селектор метода,<br />
который является обработчиком события. Из следующего фрагмента кода видно, как<br />
объект ListPane создается внутри подкласса ViewManager и как ViewManager<br />
регистрирует обработчик события #select:<br />
self addSubpane: (ListPane new<br />
paneName: 'myListPane';<br />
owner: self;<br />
when: #select perform: #listSelect:).