09.04.2016 Views

Priemioop

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:).

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!