Идиомы реализации и лучшие
практики
Создание устойчивых, масштабируемых и удобныхв сопровождении клиентских приложений с
PureMVC, с примерами на ActionScript 3 и MXMLAUTHOR: Cliff Hall <cliff@puremvc.org>
TRANSLATORS: Denis Sheremetov <flexc0dr@gmail.com> sheremetov.com
Denis Volokh <denis.volokh@gmail.com> denisvolokh.blogspot.com
Dmitry 'Reijii' Kochetov <kodjii@gmail.com> reijii.solartxit.com
Roman Pavlenko < russia.roman@gmail.com> riactive.ru
Rostislav ‘RostislavR’ Siryk < rostislav.siryk @gmail.com> en.flash-ripper.com
LAST MODIFIED: 20/05/2008Духовная литература
PureMVC — это фреймворк, основанный на шаблонах
проектирования. Он появился из насущной необходимости
проектирования высокопроизводительных RIA-клиентов.
Сейчас он уже портирован на другие языки и платформы,включая серверные среды. Этот документ посвящен
клиентским приложениям.
Хотя интерпретация и реализация имеют свои особенностидля каждой поддерживаемой
PureMVC платформы, используемые паттерны описаны визвестной книге ‘Gang of Four’: Design Patterns: Elementsof Reusable Object-Oriented Software (GoF)(ISBN 0-201-63361-2)
Очень рекомендуем.

PureMVC является бесплатным фреймворком с открытым кодом от Futurescale, Inc.
Copyright © 2006-09. Некоторые права защищены. Использование ограничено лицензией Creative Commons 3.0.
Документация, обучающие материалы и примеры кода с сайта Futurescale’s предоставляются «как есть», без всяких
гарантий и включая, но, не ограничиваясь ими, подразумеваемые гарантии пригодности для целей, или гарантий
ненарушения прав. Implementation Idioms & Best Practices.doc

2Вступительное слово
Друзья, представляем вашему вниманию перевод официальной документации
к PureMVC на русский язык. Перевести этот документ предложил Денис
“mrJazz” Шереметов в чате UAFPUG 9 февраля 2009 года. На его предложение
отозвались Роман Павленко, Денис “Barmaleychik” Волох, Дмитрий “Reijii”
Кочетов и Ростислав “RostislavR” Сирык.
Отозвавшись, они разбили документ на пять частей, и тайно перевели его нарусский язык. Тут с ними связался Денис «Хитрый» Романко и спросил, естьли материалы по PureMVC на русском языке, он очень хотел его изучить (неязык, а PureMVC). Обрадовавшись этому совпадению, заговорщики
предложили Хитрому прочесть перевод, но при условии, что он напишет своикритические комментарии к нему.
Денис, как человек, на тот момент мало знакомый с PureMVC, идеально
подошел на роль бета-тестера. Он написал свои комментарии к документу иони были тут же учтены в финальной версии.
Так появилось нижеследующее.

PureMVC является бесплатным фреймворком с открытым кодом от Futurescale, Inc.
Copyright © 2006-09. Некоторые права защищены. Использование ограничено лицензией Creative Commons 3.0.
Документация, обучающие материалы и примеры кода с сайта Futurescale’s предоставляются «как есть», без всяких
гарантий и включая, но, не ограничиваясь ими, подразумеваемые гарантии пригодности для целей, или гарантий
ненарушения прав. Implementation Idioms & Best Practices.doc

3Как мы перевели термины — примечания
переводчиковВ переводе учтены существующие популярные русскоязычные материалы попаттернам, такие, как этот обзор паттернов проектирования и Википедия.
Но, невзирая на это, многие термины переведены иначе, т.е. лучше ☺
#Термин

Перевод

1

PatternПри первом упоминании: "паттерн (шаблон проектирования)", привсех следующих упоминаниях: "паттерн"

2

tier

Уровень

3

Core ActorsБазовые классы

4

MediatorМедиатор (Посредник)5

View componentКомпонент представления, Представление

6

NotificationОповещение

7

Proxy

Прокси

8

mappingСвязывание, присваивание, назначение, проецирование

9

named referencesИменованные ссылки

10 ControlКомпонент

11 custom typed ObjectСпециализированный объект

12 ControllerКонтроллер

13 Concrete classКонкретный класс

14 Flash display objectsОбъекты Flash15 dispatcherОтправитель/вещатель

16 ObserverНаблюдатель

17 loosely-coupledСлабо связанные (компоненты системы)18 use caseСценарий использования

19 overrideПереопределять (унаследованный метод класса)20 SingletonСинглтон, Одиночка, синглетон, псих-одиночка

21 actorИгрок (игрок системы)22 Data ObjectОбъект данных

23 FrameworkФреймворк, фреймверк, фреймуорк, фрамеворк

24 Domain LogicЛогика предметной области

PureMVC является бесплатным фреймворком с открытым кодом от Futurescale, Inc.
Copyright © 2006-09. Некоторые права защищены. Использование ограничено лицензией Creative Commons 3.0.
Документация, обучающие материалы и примеры кода с сайта Futurescale’s предоставляются «как есть», без всяких
гарантий и включая, но, не ограничиваясь ими, подразумеваемые гарантии пригодности для целей, или гарантий
ненарушения прав. Implementation Idioms & Best Practices.doc

4Концепция PureMVCФреймворк PureMVC преследует очень узкую цель. Она в том, чтобы помочьвам разделить интересы кода вашего приложения на три отдельных уровня:Модель (Model), Представление (View) и Контроллер (Controller).
Для создания масштабируемых и легко поддерживаемых
высоким приоритетом являются
разделение интересов,герметичность и направление связей между уровнями MVC"

приложенийа так жеВ данной реализации классического мета-паттерна MVC эти три уровня
приложения управляются тремя синглтонами (классами, для которых
возможно существование одного и только одного экземпляра), называемыми
просто: Модель (Model), Представление (View) и Контроллер (Controller). Всевместе они называются Базовыми классами (Core actors).
Четвертый синглтон, Фасад (Façade), упрощает разработку, предоставляя
единый интерфейс для сообщения с Базовыми классами.
Модель и Прокси (Model & Proxies)Модель просто кэширует именованные ссылки к Прокси. Код Прокси
манипулирует моделью данных, связываясь с удаленными сервисами, еслинужно сохранить или запросить данные.
Таким образом, Модель данных изолирована от контроллеров
представления. Это приводит к переносимому коду Модели.

иПредставление и Медиаторы (View & Mediators)Представление в первую очередь кэширует именованные ссылки наМедиаторы. Код Медиатора обслуживает компонент(ы) Представления,добавляя к ним Слушателей событий и от их имени отправляя и получая
оповещения к и от остальной системы, при этом непосредственно управляяих состоянием.
Это отделяет определение Вида от управляющей им логики.
PureMVC является бесплатным фреймворком с открытым кодом от Futurescale, Inc.
Copyright © 2006-09. Некоторые права защищены. Использование ограничено лицензией Creative Commons 3.0.
Документация, обучающие материалы и примеры кода с сайта Futurescale’s предоставляются «как есть», без всяких
гарантий и включая, но, не ограничиваясь ими, подразумеваемые гарантии пригодности для целей, или гарантий
ненарушения прав. Implementation Idioms & Best Practices.doc

5Концепция PureMVCКонтроллер и Команды (Controller & Commands)Контроллер кеширует ссылки на классы Команд, создавая экземпляры
класса команды в тот момент, когда возникает необходимость выполнения
этой команды и уничтожая после выполнения.
Команды могут запрашивать Прокси и взаимодействовать с ними,отправлять Оповещения, выполнять другие Команды, и часто используютсядля дирижирования сложными, охватывающими всю или почти всю систему
действиями, такими, как запуск или остановка приложения. Это альмаматер бизнес-логики вашего приложения.
Фасад и Ядро (Façade & Core)Фасад (Façade), еще один синглтон, инициализирует Базовые классы
(Модель, Предтавление и Контроллер) и предоставляет единую точку
доступа ко всем их публичным методам.
Расширяя Фасад, ваше приложение получает в распоряжение весьфункционал Базовых классов без необходимости их импорта и прямой
работы с ними. Вы реализуете конкретный Фасад в своем приложении
только один раз, и это делается очень просто.
Прокси,Медиаторы
иКоманды
могутиспользовать
конкретный
Фасад вашего приложения для того, чтобы получать доступ и связываться
друг с другом.
Наблюдатели и Оповещения (Observers & Notifications)
PureMVC-приложения могут выполняться в средах, отличных от Flash
Player, не имея доступа к его событиям и диспетчерам (классы Event и
EventDispatcher), так что фреймворк реализует схему оповещений
Наблюдатель (Observer) для сообщения между Базовыми классами MVC идругими частями системы в манере слабого связывания.

PureMVC является бесплатным фреймворком с открытым кодом от Futurescale, Inc.
Copyright © 2006-09. Некоторые права защищены. Использование ограничено лицензией Creative Commons 3.0.
Документация, обучающие материалы и примеры кода с сайта Futurescale’s предоставляются «как есть», без всяких
гарантий и включая, но, не ограничиваясь ими, подразумеваемые гарантии пригодности для целей, или гарантий
ненарушения прав. Implementation Idioms & Best Practices.doc

6Концепция PureMVCНаблюдатели и Оповещения (Observers & Notifications)
Вам
не
нужно
беспокоиться
одеталях
реализации
Наблюдателя/Оповещения
(Observer/Notification)
в
PureMVC;этовнутренняя часть фреймворка. Вам нужно только использовать простой
метод для отправки Оповещений от Прокси, Медиаторов, Команд и Фасада,который даже не требует создавать экземпляр Оповещения.
Оповещения можно использовать для запуска Команд
Команды связаны с именами Оповещений в вашем конкретном Фасаде иавтоматически
выполняются
Контроллером,когдаотправляются
назначенные им Оповещения. Команды обычно дирижируют сложным
взаимодействием между интересами Представления и Модели, при этомзная о них настолько мало, насколько это возможно.
Медиаторы отправляют и получают Оповещения, а так же заявляют озаинтересованности в нихПри регистрации в Представлении Медиаторы опрашиваются на предмет ихзаинтересованности в Оповещениях, для чего вызывается метод
listNotifications, и должны возвращать массив имен Оповещений, в которыхони заинтересованы.
Позже, когда кто-то в системе отправляет одноименное Оповещение,заинтересованные Медиаторы будут оповещены через вызов их метода
handleNotification, которому будет передана ссылка на Оповещение.
Прокси отправляют, но не получают Оповещений
Прокси могут отправлять Оповещения по различным поводам. Например,Прокси для удаленного сервиса может оповестить систему о том, что онполучил результат с сервера. Или другой Прокси может оповестить системуо том, что изменились его данные.
PureMVC является бесплатным фреймворком с открытым кодом от Futurescale, Inc.
Copyright © 2006-09. Некоторые права защищены. Использование ограничено лицензией Creative Commons 3.0.
Документация, обучающие материалы и примеры кода с сайта Futurescale’s предоставляются «как есть», без всяких
гарантий и включая, но, не ограничиваясь ими, подразумеваемые гарантии пригодности для целей, или гарантий
ненарушения прав. Implementation Idioms & Best Practices.doc

7Концепция PureMVCПрокси отправляют, но не получают ОповещенийДля Прокси слушать Оповещения — это слишком сильное связывание суровнями Вида и Контроллера.
Эти уровни обязаны слушать Оповещения от Прокси, так как их функция
заключается в визуальном представлении и обеспечении взаимодействия
пользователя с данными Модели, за которые отвечают Прокси.
Тем не менее, уровни Вида и Контроллера должны иметь возможность
изменений, не влияющих на уровень Модели данных.
Например,административное
приложение
исвязанное
снимпользовательское приложение могут иметь общие классы уровня Модели.
Если отличаются только сценарии использования, то эти отличия можно
реализовать за счет различных комбинаций Представления и Контроллера,работающих с одной и той же Моделью.

Фасад (Façade)Три Базовых класса мета-паттерна MVC представлены в PureMVCклассами Модели, Представления и Контроллера. Чтобы упростить процесс
разработки приложения, PureMVC задействует паттерн Фасад.
Фасад распределяет ваши запросы к Модели, Представлению и Контроллеру,так что ваш код не нуждается в импорте этих классов и вам не нужно
работать с ними индивидуально. Класс Фасада автоматически создает
экземпляры базовых синглтонов MVC в своем конструкторе.
Обычно Фасад самого фреймворка становится над-классом вашего
приложения и используется для инициализации Контроллера с назначениями
Команд. Подготовка Модели и Представления затем дирижируется
Командами, выполняемыми Контроллером.

PureMVC является бесплатным фреймворком с открытым кодом от Futurescale, Inc.
Copyright © 2006-09. Некоторые права защищены. Использование ограничено лицензией Creative Commons 3.0.
Документация, обучающие материалы и примеры кода с сайта Futurescale’s предоставляются «как есть», без всяких
гарантий и включая, но, не ограничиваясь ими, подразумеваемые гарантии пригодности для целей, или гарантий
ненарушения прав. Implementation Idioms & Best Practices.doc

8ФасадЧто такое Конкретный Фасад (Concrete Façade)?
Хотя Базовые классы являются завершенными, готовыми к использованию
реализациями,Фасад предоставляет
реализацию,которую
следует
рассматривать как абстрактную в том смысле, что вы никогда не создаетеего экземпляр непосредственным образом.
Вместо этого вы наследуете Фасад из фреймворка и / или переопределяете
некоторые его методы, чтобы сделать их полезными конкретно для вашего
приложения. (Примечание переводчика: вы конкретизируете абстрактный
Фасад фреймворка в конкретный Фасад своего приложения).
Этот конкретный Фасад затем используется для доступа и оповещения
Команд, Медиаторов и Прокси, которые делают свою работу в системе. Посоглашению, он называется ‘ApplicationFacade’, но вы можете назвать егокак хотите.
В общем случае иерархия Представления вашего приложения (компоненты
дисплея) будет создаваться согласно принятого для вашей платформы
процесса. Во Flex — MXML-приложения создает всех своих потомков илиFlash-приложение создает все свои объекты на Сцене. Как только
построена иерархия Представления приложения, стартует аппарат PureMVC
и регионы Модели и Вида готовятся к использованию.
Ваш конкретный Фасад также используется для облегчения процесса
старта приложения, в том смысле, что он освобождает основной кодприложения от необходимости глубокой осведомленности об аппарате
PureMVC, к которому это приложение будет подключено. Приложение
просто передает ссылку на себя в метод ‘startup’ синглтон-экземпляра
вашего конкретного Фасада.
Создание Конкретного Фасада для вашего приложения

PureMVC является бесплатным фреймворком с открытым кодом от Futurescale, Inc.
Copyright © 2006-09. Некоторые права защищены. Использование ограничено лицензией Creative Commons 3.0.
Документация, обучающие материалы и примеры кода с сайта Futurescale’s предоставляются «как есть», без всяких
гарантий и включая, но, не ограничиваясь ими, подразумеваемые гарантии пригодности для целей, или гарантий
ненарушения прав. Implementation Idioms & Best Practices.doc

9Вашему конкретному Фасаду не обязательно прилагать много усилий,чтобы передать приложению силу PureMVC. Рассмотрим следующую
реализацию:ApplicationFacade.as:package com.me.myapp{
import org.puremvc.as3.interfaces.*;
import org.puremvc.as3..patterns.facade.*;import com.me.myapp.view.*;
import com.me.myapp.model.*;import com.me.myapp.controller.*;// Конкретный фасад для MyApp
public class ApplicationFacade extends Façade implements IFacade{// Определим имена констант для Оповещений
public static const STARTUP:String = "startup";
public static const LOGIN:String = "login";// Метод фабрики Синглтона ApplicationFacade
public static function getInstance() : ApplicationFacade{if ( instance == null ) instance = new ApplicationFacade( );return instance as ApplicationFacade;}// Регистрируем Команды через Контроллер
override protected function initializeController( ) : void{
super.initializeController();registerCommand( STARTUP, StartupCommand );registerCommand( LOGIN, LoginCommand );registerCommand( LoginProxy.LOGIN_SUCCESS, GetPrefsCommand );}// Запускаем аппарат PureMVC, передавая внутрь ссылку на
public function startup( app:MyApp ) : void{
sendNotification( STARTUP, app );}}}PureMVC является бесплатным фреймворком с открытым кодом от Futurescale, Inc.
Copyright © 2006-09. Некоторые права защищены. Использование ограничено лицензией Creative Commons 3.0.
Документация, обучающие материалы и примеры кода с сайта Futurescale’s предоставляются «как есть», без всяких
гарантий и включая, но, не ограничиваясь ими, подразумеваемые гарантии пригодности для целей, или гарантий
ненарушения прав. Implementation Idioms & Best Practices.doc

10Фасад
Создание Конкретного Фасада для вашего приложенияo Отметим несколько моментов в приведенном выше коде:o Он расширяет класс Facade PureMVC, который в свою очередь
реализует интерфейс IFacade.
o Он не переопределяет конструктор. Если бы он это делал, то нужно
было бы вызвать конструктор суперкласса прежде, чем делать чтолибо.
o Он определяет статический метод getInstance, возвращающий
экземпляр Синглтона, создавая и кэшируя его при необходимости.
Ссылка на экземпляр сохраняется в защищенном (protected) свойстве
супер-класса (Façade) и должна приводиться к типу подкласса перед
возвращением.
o Он определяет константы для имен Оповещений. Поскольку этоигрок, используемый всеми другими участинками системы длядоступа и связи друг с другом, конкретный Фасад является
идеальным местом для определения констант, общих для всехучастников обмена оповещениями.
o Онинициализирует
Контроллер
Командами,которые
выполняться при отправке соответствующих Оповещений.

будутo Он предоставляет метод startup, который принимает один аргумент (вданном случае) типа MyApp, который с помощью Оповещения
передается Команде StartupCommand (зарегистрированной на имяоповещения STARTUP).
С этими простыми требованиями реализации ваш конкретный Фасад
унаследует ощутимую часть функциональности своего абстрактного классародителя.

PureMVC является бесплатным фреймворком с открытым кодом от Futurescale, Inc.
Copyright © 2006-09. Некоторые права защищены. Использование ограничено лицензией Creative Commons 3.0.
Документация, обучающие материалы и примеры кода с сайта Futurescale’s предоставляются «как есть», без всяких
гарантий и включая, но, не ограничиваясь ими, подразумеваемые гарантии пригодности для целей, или гарантий
ненарушения прав. Implementation Idioms & Best Practices.doc

11Фасад
Инициализация вашего Конкретного Фасада
Конструктор Фасада PureMVC вызывает защищенные методы дляинициализации экземпляров Модели, Представления и Контроллера икэширует их ссылки на них.
Затем по композиции Фасад реализует и делает доступными возможности
Модели, Представления и Контроллера; агрегируя их функциональность изащищая
разработчика
отпрямого
взаимодействия
сБазовыми
классами фреймворка.
Итак, где и как Фасад внедряется в реальное положение вещей
конкретного приложения? Рассмотрим следующее Flex-приложение:MyApp.mxml:<?xml version="1.0" encoding="utf-8"?><mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="façade.startup(this)”><mx:Script><![CDATA[// Получить ApplicationFacade
import com.me.myapp.ApplicationFacade;private var facade:ApplicationFacade = ApplicationFacade.getInstance();]]></mx:Script><!— Здесь определена остальная часть иерархии представления --></mx:Application>Вот и все. Достаточно просто.
Создайте эту начальную иерархию вида, получите
экземпляр ApplicationFaçade и вызовите его метод startup.
ПРИМЕЧАНИЕ: В AIR, мы бы использовали событие ‘applicationComplete’, а во Flash мымогли создать экземпляр Фасада и вызвать startup в первом кадре или в отдельном Классе
Документа (Document Class).

PureMVC является бесплатным фреймворком с открытым кодом от Futurescale, Inc.
Copyright © 2006-09. Некоторые права защищены. Использование ограничено лицензией Creative Commons 3.0.
Документация, обучающие материалы и примеры кода с сайта Futurescale’s предоставляются «как есть», без всяких
гарантий и включая, но, не ограничиваясь ими, подразумеваемые гарантии пригодности для целей, или гарантий
ненарушения прав. Implementation Idioms & Best Practices.doc

12Фасад
Инициализация вашего Конкретного Фасада
Ключевые моменты этого примера:o Мы создавали интерфейс как обычно, в декларативном стиле
MXML; начиная с тэга <mx:Application>, содержащего
компоненты и контейнеры.
o Блок кода используется для объявления и инициализации
приватной
переменной-ссылки
наэкземпляр
синглтона
конкретного ApplicationFacade.
o Поскольку
мыинициализируем
переменную
вызовом
статического метода ApplicationFacade.getInstance, то этоозначает, что в момент события Application creationCompleteбудет создан Фасад, а вместе с ним и Модель, Представление иКонтроллер, хотя ни Медиаторы, ни Прокси не будут покасозданы.
o В обработчике события creationComplete тэга Application мывызываем метод startup, передавая ему ссылку на главное
приложение в качестве аргумента.
Заметьте, что обычные компоненты Представления не нуждаются в знании
того, как им нужно взаимодействовать с Фасадом, но объект верхнего
уровня Application является исключением для этого правила.
Верхнеуровневый объект Application (или Flash-приложение) строит
иерархию Вида, инициализируют Фасад, а затем запускает аппарат
PureMVC.

PureMVC является бесплатным фреймворком с открытым кодом от Futurescale, Inc.
Copyright © 2006-09. Некоторые права защищены. Использование ограничено лицензией Creative Commons 3.0.
Документация, обучающие материалы и примеры кода с сайта Futurescale’s предоставляются «как есть», без всяких
гарантий и включая, но, не ограничиваясь ими, подразумеваемые гарантии пригодности для целей, или гарантий
ненарушения прав. Implementation Idioms & Best Practices.doc

13Оповещения
В PureMVC реализован паттерн Наблюдатель (Observer) так, что Базовые
классы и взаимодействующие с ними классы могут общаться «слабо
сцепленным» образом, и без привязок к платформе.
ActionScript не предоставляет событийную модель и то что используется во
Flex и Flash реализовано в классах пакета.
Фреймворк портирован на другие платформы, такие как C# и J2ME, поэтому
используется внутренний механизм взаимодействия вместо привязки креализации на Flash.
Это не просто замена для Событий (Events). Оповещения (Notifications)работают в корне иначе, и органичное совмещение с Событиями (Events)предоставляет возможность создавать компоненты Представления длямногократного использования, которые могут даже не знать о том, что онисвязаны с PureMVC приложением, если всё построено правильно.
События и Оповещения
События
вещаются
изобъектов
Flash,
реализующих
интерфейс
IEventDispatcher. Событие «поднимается вверх» по иерархии, позволяя
родительским объектам перехватывать Событие, либо передавать выше поиерархии.
Этомеханизм
цепочки
ответственностей,посредством
которого
возможность получить Событие имеют дети/родители, выполняя действия
через Событие, либо имея ссылку на отправителя и подписываясь
«слушателем» на событие.
Оповещения рассылаются Фасадом и Прокси; слушаются и отсылаются
Медиаторами;отправляются
Командам.
Этомеханизм
публикации/подписки,посредством
которого
многие
Наблюдатели
(Observers) могут получать и обрабатывать одно и тоже Оповещение.

PureMVC является бесплатным фреймворком с открытым кодом от Futurescale, Inc.
Copyright © 2006-09. Некоторые права защищены. Использование ограничено лицензией Creative Commons 3.0.
Документация, обучающие материалы и примеры кода с сайта Futurescale’s предоставляются «как есть», без всяких
гарантий и включая, но, не ограничиваясь ими, подразумеваемые гарантии пригодности для целей, или гарантий
ненарушения прав. Implementation Idioms & Best Practices.doc

14Оповещения
События и Оповещения
Оповещения могут иметь, если нужно, «тело», любой объект ActionScript.
В отличии от событий Flash, создание специализированных классов
Оповещений, требуется редко, потому может быть использовано прямо «изкоробки». Вы можете, конечно, создавать специализированные классы
Оповещений для строгой типизации при взаимодействии с ними, но, нужно
соизмерять преимущества проверки времени компиляции (в частности дляОповещений) и накладных расходов по поддержки множественных классов
Оповещений, так что это, скорее, вопрос стиля программирования.
Оповещения также имеют опциональный «тип»,использован получателем для классификации.

который

моет

быть

Например, в приложении редактора документов, это может быть экземпляр
Прокси для каждого документа, который открыт, и соответствующий
Медиатор
длякомпонента
Представления,используемый
дляредактирования документа. Прокси и Медиатор могут совместно
использовать уникальные ключ, который Прокси передаст как типОповещения.
Все экземпляры Медиаторов регистрируются для перехвата Оповещений отПрокси, используя тип Оповещения для принятия решения о его обработке.

Определение Оповещений и констант СобытийМы видим, что конкретный Фасад это хорошее место для определения
общего в приложении, констант Оповещений. Поскольку это центральный
механизм для взаимодействий с системой, все подписавшиеся наоповещения будут по умолчанию взаимодействовать с Фасадом.

PureMVC является бесплатным фреймворком с открытым кодом от Futurescale, Inc.
Copyright © 2006-09. Некоторые права защищены. Использование ограничено лицензией Creative Commons 3.0.
Документация, обучающие материалы и примеры кода с сайта Futurescale’s предоставляются «как есть», без всяких
гарантий и включая, но, не ограничиваясь ими, подразумеваемые гарантии пригодности для целей, или гарантий
ненарушения прав. Implementation Idioms & Best Practices.doc

15Оповещения
Определение Оповещений и констант Событий
Иногда для этих целей вместо определения констант в Фасаде приложения
используется отдельный класс “Констант Приложения”, в случае если этиконстанты должны быть доступны другому приложению.
В любом случае, централизованное определение констант для Оповещений
гарантирует, что когда один из подписчиков должен сослаться к имени
Оповещения, мы можем делать это безопасным образом, оставляя проверку
мелких ошибок в синтаксисе компилятору.
Однако не следует определять имена Событий в конкретном фасаде.
Определите их как статичные константы классов, которые их вызывают,или же в случае кастомных Событий, внутри классов этих Событий.
Реализации частей Приложения, компонентов Представления и Объектов
Данных могут оставаться многократно используемыми, если онивзаимодействуют со связанными Медиаторами и Прокси не через вызовы
методов а через отсылку Оповещений.
Если компонент Представления либо Объект Данных вещает Оповещение вкотором заинтересован Медиатор или Прокси, то знание имени этого
события нужно только этой паре, всё остальное взаимодействие между
слушателем и остальной частью PureMVC приложения может бытьорганизовано посредством Оповещений.
Несмотря
нато,чтоотношения
этихвзаимодействующих
пар(Медиатор/Представление и Прокси/Объект Данных) довольно близки, ониостаются «слабо связанными» с остальными частями приложения; прижелании модифицировать пользовательский интерфейс либо модель
данных могут быть легко подвергнуты рефакторингу.

PureMVC является бесплатным фреймворком с открытым кодом от Futurescale, Inc.
Copyright © 2006-09. Некоторые права защищены. Использование ограничено лицензией Creative Commons 3.0.
Документация, обучающие материалы и примеры кода с сайта Futurescale’s предоставляются «как есть», без всяких
гарантий и включая, но, не ограничиваясь ими, подразумеваемые гарантии пригодности для целей, или гарантий
ненарушения прав. Implementation Idioms & Best Practices.doc

16Команды
Определенный Фасад инициализирует Контроллер, передавая Командам
связанные с ними Оповещения необходимые для старта приложения.
Для каждой связки (Mapping), Контроллер регистрируется как Наблюдательнад данным Оповещением. Когда происходит Оповещение, Контроллер
создает экземпляр соответствующей Команды. И, наконец, Контроллер
вызывает у созданной команды метод execute(), передавая в него данное
Оповещение.
Команды
единоразовы;онисоздаются
потребованию
(приходит
Оповещение), и после их исполнения (вызов метода execute) они должны
удалятся. В связи с чем, важно не создавать экземпляры и не хранить ссылкина Команды в объектах, которые будет использоваться в течении долго срокав вашем приложении.
Использование Макро- и Простых команд
Команды, как и все классы фреймворка PureMVC, реализовывают
интерфейс, а именно интерфейс ICommand. PureMVC содержит двереализации ICommand которые вы можете с легкостью расширять.
Класс SimpleCommand (Простая команда) всего-навсего содержит метод
execute, который принимает в качестве параметра экземпляр INotification.
Вписываете вашу функциональность в метод execute и все готово к работе.
Класс MacroCommand (Макрокоманда) позволяет выполнять несколько
подкоманд последовательно, каждой из которых будет после создания
передан экземпляр текущего Оповещения.
Класс
MacroCommandизконструктора
вызывает
свойметод
initializeMacroCommand. Вы должны переопределить его в своем классе
макрокоманды, для вызова метода addSubCommand для каждой команды,которую вы ходите добавить в макрокоманду. Вы можете добавлять любые
Команды или Макрокоманды.

PureMVC является бесплатным фреймворком с открытым кодом от Futurescale, Inc.
Copyright © 2006-09. Некоторые права защищены. Использование ограничено лицензией Creative Commons 3.0.
Документация, обучающие материалы и примеры кода с сайта Futurescale’s предоставляются «как есть», без всяких
гарантий и включая, но, не ограничиваясь ими, подразумеваемые гарантии пригодности для целей, или гарантий
ненарушения прав. Implementation Idioms & Best Practices.doc

17Команды
Слабое связывание Команд с Медиаторами и Прокси
Команды выполняются Контроллером в результате отправки Оповещения.
Команды не должны быть созданы и выполнены никем кроме Контроллера.
Чтобы общаться и взаимодействовать с другими частями системы, Команды
могут:o Регистрировать, удалять или проверять существуют ли Медиаторы,Прокси и Команды.
o Посылать Оповещения, для получения ответной реакции от других
команд или Медиаторов.
o Получать экземпляры
напрямую.

Прокси

иМедиаторов

иуправлять

имиКоманды позволяют нам легко переключать элементы Представления
между различными состояниями (через Медиаторы), или передавать
данные к различным частям этих элементов.
Они могут быть использованы для осуществления транзакционного
взаимодействия с Моделью, которую охватывают несколько Прокси,требовать отправки Оповещения по окончанию транзакции, илиобрабатывать непредвиденные ситуации (exceptions) и принимать
соответствующие действия.
Взаимодействие сложных действий и бизнес-логикиВ местах вашего приложения, где вы могли бы разместить код (Команд,Медиаторов и Прокси) неизбежно и периодически будет возникать вопрос:Какой код и где писать? Что конкретно должна делать Команда?

PureMVC является бесплатным фреймворком с открытым кодом от Futurescale, Inc.
Copyright © 2006-09. Некоторые права защищены. Использование ограничено лицензией Creative Commons 3.0.
Документация, обучающие материалы и примеры кода с сайта Futurescale’s предоставляются «как есть», без всяких
гарантий и включая, но, не ограничиваясь ими, подразумеваемые гарантии пригодности для целей, или гарантий
ненарушения прав. Implementation Idioms & Best Practices.doc

18Команды
Взаимодействие сложных действий и бизнес-логики
Первое разделение логики в вашем приложении коснется бизнес-логики илогики предметной области.
В командах находится бизнес-логика нашего приложения; ожидается, чтотехническая реализация сценариев использования нашего приложения
будет выполняться на уровне модели предметной области (Domain Model).
Это подразумевает координацию Модели и состояниями Представления.
Модель поддерживает свою целостность, используя Прокси, которые
размещены в логике предметной области (Domain Logic), открывая API дляработы с объектами данных. Они инкапсулируют весь доступ к моделям
данных, находящимся на клиенте или на сервере, для того чтобы остальная
часть приложения которая работает с данными, могли иметь к нимсинхронный или асинхронный доступ.
Команды могут быть использованы для управления рядом действий всистеме, которые должны происходить в определенном порядке, свозможностью того что результат предыдущего действия может бытьиспользован для последующего.
Медиаторы и Прокси должны предоставлять крупномодульные интерфейсы
Командам (и наоборот), которые скрывают реализацию объектов данных икомпонентов представления, которыми они управляют.
Заметьте, что когда мы говорим про компонент представления, мы имеем ввиду кнопку или виджет, с которым непосредственно взаимодействует
пользователь. Когда мы говорим об объекте данных, то подразумеваем
произвольные структуры данных, а также удаленные сервисы, которые
могут быть использованы для хранения или получения данных.
Команды взаимодействуют с Медиаторами и Прокси, но должны бытьизолированы от граничных реализаций. Вот пример того как Команда
используется для подготовки приложения к работе:PureMVC является бесплатным фреймворком с открытым кодом от Futurescale, Inc.
Copyright © 2006-09. Некоторые права защищены. Использование ограничено лицензией Creative Commons 3.0.
Документация, обучающие материалы и примеры кода с сайта Futurescale’s предоставляются «как есть», без всяких
гарантий и включая, но, не ограничиваясь ими, подразумеваемые гарантии пригодности для целей, или гарантий
ненарушения прав. Implementation Idioms & Best Practices.doc

19Команды
Взаимодействие сложных действий и бизнес-логики
StartupCommand.as:package com.me.myapp.controller {import org.puremvc.as3.interfaces.*;
import org.puremvc.as3.patterns.command.*;import com.me.myapp.controller.*;}// MacroCommand запускается при старте приложения
public class StartupCommand extends MacroCommand {// Инициализация макрокоманды добавлением подкоманд
override protected function initializeMacroCommand() : void {addSubCommand( ModelPrepCommand );addSubCommand( ViewPrepCommand );}}Это макрокоманда, которая содержит две подкоманды, которые при вызове
макрокоманды исполняются в порядке очереди (FIFO).
Это создает 'очередь' верхнего уровня из действий, которые должны бытьвыполнены на старте приложения. Но что конкретно должны мы сделать, ив каком порядке?
Прежде чем пользователь увидит или сможет взаимодействовать сприложением и его данными, Модель должна быть надлежащим образом
подготовлена. Как только это сделано, Представление может бытьподготовлено для отображения данных Модели и позволить пользователю
взаимодействовать с ними.
Следовательно, процесс старта обычно состоит из двух обширных групп
операций
—подготовка
Модели,ипоследующая
подготовка
Представления.

PureMVC является бесплатным фреймворком с открытым кодом от Futurescale, Inc.
Copyright © 2006-09. Некоторые права защищены. Использование ограничено лицензией Creative Commons 3.0.
Документация, обучающие материалы и примеры кода с сайта Futurescale’s предоставляются «как есть», без всяких
гарантий и включая, но, не ограничиваясь ими, подразумеваемые гарантии пригодности для целей, или гарантий
ненарушения прав. Implementation Idioms & Best Practices.doc

20Команды
Взаимодействие сложных действий и бизнес-логики
ModelPrepCommand.as:package com.me.myapp.controller {import org.puremvc.as3.interfaces.*;
import org.puremvc.as3.patterns.observer.*;
import org.puremvc.as3.patterns.command.*;import com.me.myapp.*;import com.me.myapp.model.*;}// Создание и регистрация Прокси с Моделью
public class ModelPrepCommand extends SimpleCommand {// Вызов Макрокомманды
override public function execute( note : INotification ) : void {facade.registerProxy( new SearchProxy() );facade.registerProxy( new PrefsProxy() );facade.registerProxy( new UsersProxy() );}}Подготовка Модели, обычно, является простым созданием и регистрацией
всех Прокси, в которых приложение будет нуждаться при запуске.
Пример команды ModelPrepCommand, это Простая команда, которая
подготавливает Модель к дальнейшей работе. Это первая из подкоманд
макрокоманды, и поэтому она будет выполнена первой.
Через конкретный Фасад, она создает и регистрирует те Прокси, которые
система будет использовать при запуске. Заметьте, что Команда не делает
никаких манипуляций или инициализаций с данными Модели. Прокси
отвечает за любое получение данных, создание или инициализацию
необходимых Объектов Данных для использования в системе.

PureMVC является бесплатным фреймворком с открытым кодом от Futurescale, Inc.
Copyright © 2006-09. Некоторые права защищены. Использование ограничено лицензией Creative Commons 3.0.
Документация, обучающие материалы и примеры кода с сайта Futurescale’s предоставляются «как есть», без всяких
гарантий и включая, но, не ограничиваясь ими, подразумеваемые гарантии пригодности для целей, или гарантий
ненарушения прав. Implementation Idioms & Best Practices.doc

21Команды
Взаимодействие сложных действий и бизнес-логики
ViewPrepCommand.as:package com.me.myapp.controller {import org.puremvc.as3.interfaces.*;
import org.puremvc.as3.patterns.observer.*;
import org.puremvc.as3.patterns.command.*;import com.me.myapp.*;import com.me.myapp.view.*;}// Создание и регистрация Медиатора с Представлением
public class ViewPrepCommand extends SimpleCommand {override public function execute( note : INotification ) : void {var app:MyApp = note.getBody() as MyApp;
facade.registerMediator( new ApplicationMediator( app ) );}}Это простая команда которая подготавливает Представление для работы.
Это последняя из подкоманд макрокоманды, следовательно, будет
выполнена последней.
Отметьте,чтосоздается
ApplicationMediator, который
приложения.

ирегистрируется
только
Медиатор
обслуживает компонент представленияВ дальнейшем, тело Оповещения передается в конструктор медиатора. Этоссылка на приложение, переданная самим приложением вместе сОповещением, когда первоначальное Оповещение STARTUP было послано.
(Согласно предыдущему примеру приложения MyApp.)

PureMVC является бесплатным фреймворком с открытым кодом от Futurescale, Inc.
Copyright © 2006-09. Некоторые права защищены. Использование ограничено лицензией Creative Commons 3.0.
Документация, обучающие материалы и примеры кода с сайта Futurescale’s предоставляются «как есть», без всяких
гарантий и включая, но, не ограничиваясь ими, подразумеваемые гарантии пригодности для целей, или гарантий
ненарушения прав. Implementation Idioms & Best Practices.doc

22Команды
Взаимодействие сложных действий и бизнес-логики
Приложение
этовнекоторой
степени
специальный
компонент
Представления, в котором реализуются и находятся в качестве потомковвсе другие компоненты Представления, которые инициализируются призапуске приложения.
Для взаимосвязи с остальной частью системы, компоненты Представления
должны обладать Медиаторами. И создание этих Медиаторов требует
ссылку на компоненты Представления, с которыми они будут работать, аэто на данном этапе известно только приложению.
Медиатор приложения - это единственный класс, которому допускается
знать все про реализацию Представления приложения, так что создание
оставшихся Медиаторов будет размещена внутри его конструктора.
Используя
этитрикоманды,мыобеспечили
последовательную
инициализацию Модели и Представления. При этом Команды не должны
знать много о Модели или о Представлении.
При изменении Модели или реализации Представления,Медиаторы должны быть изменены соответствующим образом.

Прокси

Бизнес-логика внутри Команд не должна
происходящих в областях применения.

изменений,зависеть

отиМодель должна формировать «логику предметной области», поддерживая
целостность
данных
внутри
Прокси.
Команды
выполняют
«транзакционную» или «бизнес» логику в Модели, формируя координацию
транзакций мульти-Прокси или обрабатывая и сообщая об исключительных
ситуациях.

PureMVC является бесплатным фреймворком с открытым кодом от Futurescale, Inc.
Copyright © 2006-09. Некоторые права защищены. Использование ограничено лицензией Creative Commons 3.0.
Документация, обучающие материалы и примеры кода с сайта Futurescale’s предоставляются «как есть», без всяких
гарантий и включая, но, не ограничиваясь ими, подразумеваемые гарантии пригодности для целей, или гарантий
ненарушения прав. Implementation Idioms & Best Practices.doc

23Медиаторы
Медиаторы используются для взаимодействия пользователей с одним илиболее компонентами Представления, (например Flex DataGrid либо FlashMovieClip), и остальными частями PureMVC приложения.
Во Flash-приложении Медиатор является местом, где обычно устанавливают
обработчики событий Представления для обработки пользовательских
действий и запросов данных от компонента. Он посылает и принимает
Оповещения (Notifications) для взаимодействия c приложением.
Задачи конкретного Медиатора
Фреймворки для Flash, Flex и AIR включают немало компонент дляпостроения
графических
интерфейсов.
Выможете
использовать
стандартные компоненты, либо реализовывать свои для представления
модели данных пользователю, и позволять ему взаимодействовать с ними.
В скором будущем будут реализованы новые платформы для запуска
ActionScript приложений. Также фреймворк портируется на другие
платформы, например уже существуют реализации для Silverlight и J2ME,расширяя горизонты его применения.
Задача PureMVC - оставаться нейтральным к используемым технологиям вприложении, предоставляя простые идиомы для работы с любыми
компонентами графического интерфейса или Моделью Данных.
Для PureMVC-приложения компонент Представления это любой элемент
управления графического интерфейса, либо контейнер с несколькими
компонентами,независимо
отконкретной
платформы.
Представление должно инкапсулировать как можно больше собственных
состояний
иопераций,предоставляя
простой
интерфейс
длявзаимодействия с ним.

PureMVC является бесплатным фреймворком с открытым кодом от Futurescale, Inc.
Copyright © 2006-09. Некоторые права защищены. Использование ограничено лицензией Creative Commons 3.0.
Документация, обучающие материалы и примеры кода с сайта Futurescale’s предоставляются «как есть», без всяких
гарантий и включая, но, не ограничиваясь ими, подразумеваемые гарантии пригодности для целей, или гарантий
ненарушения прав. Implementation Idioms & Best Practices.doc

24Медиаторы
Задачи конкретного Медиатора
Конкретный Медиатор позволяет использовать один или более компонентов
Представления в приложении используя только ссылки и предоставленное
API.
Основная задача Медиатора - обработка событий (Events), инициированных
компонентом Представления и касающихся его Оповещений (Notifications).
Медиаторы
также
часто
взаимодействуют
сПрокси.
Довольно
распространенная практика получения и хранения локальных ссылок начасто используемые экземпляры Прокси в конструкторе. Это уменьшает
многочисленные вызовы retrieveProxy для получения одних и тех жессылок.
Неявное преобразование типов компонентов Представления
Базовый класс Медиатор реализованный в PureMVC принимает в качестве
аргументов своего конструктора имя и объект Представления типа Object.
Конструктор вашего конкретного Медиатора будет принимать компонент
Представления, делая его сразу же доступным в защищенном (protected)свойстве
класса
viewComponent,обычно
типа
Object.
Вы также можете, используя метод setViewComponent, динамически
устанавливать экземпляр Представления в Медиаторе после вызова
конструктора.
После присвоения вы часто будете приводить этот объект к конкретному
типу, что может быть неудобно, а также способствовать распространению
повторяемого кода.

PureMVC является бесплатным фреймворком с открытым кодом от Futurescale, Inc.
Copyright © 2006-09. Некоторые права защищены. Использование ограничено лицензией Creative Commons 3.0.
Документация, обучающие материалы и примеры кода с сайта Futurescale’s предоставляются «как есть», без всяких
гарантий и включая, но, не ограничиваясь ими, подразумеваемые гарантии пригодности для целей, или гарантий
ненарушения прав. Implementation Idioms & Best Practices.doc

25Медиаторы
Неявное преобразование типов компонентов Представления
Язык ActionScript предоставляет возможность называемую геттеры исеттеры (getters/setters). Геттер выглядит как метод, но используется каксвойство класса. Эта возможность очень полезна для решения проблемы
частого приведения типа.
Полезная идиома применяемая в вашем конкретном Медиаторе, использование геттера для приведения типа Представления к егонастоящему типу с понятным именем.
Например так:protected function get controlBar() : MyAppControlBar {return viewComponent as MyAppControlBar;}Затем, в любом месте вашего Медиатора чем делать это так:MyAppControlBar ( viewComponent ).searchSelection = MyAppControlBar.NONE_SELECTED;Мы вместо этого делаем так:controlBar.searchSelction = MyAppControlBar.NONE_SELECTED;Взаимодействие с Представлением
Медиатор обычно имеет только один компонент Представления, но может
взаимодействовать и с несколькими, например: с ApplicationToolBar исодержащимися
внемкнопками,либодругими
аналогичными
компонентами. Мы можем иметь группу связанных компонентов (какформа) в одном Представлении и обращаться Медиатором к её элементамкак к свойствам. Но лучше инкапсулировать в Представлении как можно
больше компонентов. Иметь специализированный объект для обмена
данными тоже хорошая практика.

PureMVC является бесплатным фреймворком с открытым кодом от Futurescale, Inc.
Copyright © 2006-09. Некоторые права защищены. Использование ограничено лицензией Creative Commons 3.0.
Документация, обучающие материалы и примеры кода с сайта Futurescale’s предоставляются «как есть», без всяких
гарантий и включая, но, не ограничиваясь ими, подразумеваемые гарантии пригодности для целей, или гарантий
ненарушения прав. Implementation Idioms & Best Practices.doc

26Медиаторы
Взаимодействие с Представлением
Медиатор отвечает за взаимодействие уровня Контроллера и Модели,обновляя Представление когда получает соответствующие Оповещения
(Notifications).
Во Flash, мы обычно подписываем слушателей событий к компоненту
Представления, в момент создания Медиатора или по вызову метода
setViewComponent, определяя метод обработчика:controlBar.addEventListener( AppControlBar.BEGIN_SEARCH, onBeginSearch );Действия Медиатора,требованиями логики.

в

ответ

на

возникшее

Событие,определяется

Обычно, конкретный метод обработчика События Медиатора выполняет
такие действия:o Изучает тип События либо поля специализированного типа События,который ожидается.
o Читает или модифицирует доступные
методы) компоненты Представления.

свойства

(либовызываетo Читает или модифицирует
методы) Прокси.

свойства

(либовызывает

доступныеo Шлет одно или более Оповещение, на которое будут реагировать
Медиаторы и Команды (или даже тот же самый Медиатор).

PureMVC является бесплатным фреймворком с открытым кодом от Futurescale, Inc.
Copyright © 2006-09. Некоторые права защищены. Использование ограничено лицензией Creative Commons 3.0.
Документация, обучающие материалы и примеры кода с сайта Futurescale’s предоставляются «как есть», без всяких
гарантий и включая, но, не ограничиваясь ими, подразумеваемые гарантии пригодности для целей, или гарантий
ненарушения прав. Implementation Idioms & Best Practices.doc

27Медиаторы
Взаимодействие с Представлением
Несколько хороших правил:o Если несколько других Медиаторов должно быть вовлечено вобработку ответа на Событие, изменяйте общие Прокси либоотсылайте Оповещения, которые обработают соответствующие
Медиаторы.
o Если требуется большое количество согласованных взаимодействий,хорошая практика использовать Команду, локализируя шаги в одном
месте.
o Плохой практикой считается получение других Медиаторов, либоМедиаторов
соткрытыми
методами
длянепосредственной
манипуляции.
o Для манипулирования и распространения информации о состоянии
приложения к Медиаторам, устанавливайте значения свойств
Медиатора, или вызывайте методы Прокси, созданные для установки
состояния.
Пусть медиатор будет заинтересован в оповещениях,отправляемых Прокси, хранящих состояние приложения.
Обработка оповещений в Медиаторе
Вместо явного добавления слушателей событий для Представления,можно очень просто и почти автоматически связать между собой Медиатор
и PureMVC.
После регистрации Представления, Медиатор опрашивается на наличие
заинтересованных оповещений и в ответ возвращает массив именОповещений (Notifications name), которые он хотел бы обрабатывать.

PureMVC является бесплатным фреймворком с открытым кодом от Futurescale, Inc.
Copyright © 2006-09. Некоторые права защищены. Использование ограничено лицензией Creative Commons 3.0.
Документация, обучающие материалы и примеры кода с сайта Futurescale’s предоставляются «как есть», без всяких
гарантий и включая, но, не ограничиваясь ими, подразумеваемые гарантии пригодности для целей, или гарантий
ненарушения прав. Implementation Idioms & Best Practices.doc

28Медиаторы
Обработка оповещений в Медиаторе
Ответ проще всего реализовать с помощью одного простого выражения,которое будет возвращать массив с именами оповещений, которые должны
быть определены как статические константы, обычное это делается вФасаде приложения.
Создать список заинтересованных Оповещений (Notification Interests) дляконкретного Медиатора можно следующим образом:override public function listNotificationInterests() : Array{
return [ApplicationFacade.SEARCH_FAILED,
ApplicationFacade.SEARCH_SUCCESS];}Перечисленные оповещения, будут сразу обрабатываться Медиатором кактолько они будет отосланы любым из игроков системы, даже если ониотосланы самим Медиатором.
Внутри обработчика оповещений, для удобства и читабельности кодавместо «if / else if» лучше использовать конструкцию «switch / case».
По сути, для каждого оповещения достаточно небольшого обработчика, ався нужная информация должна находиться в самом объекте оповещения.
Правда иногда информация может быть получена от Посредника,основанная на данных из объекта оповещения. Желательно избегать
нагромождения логики в одном обработчике, иначе это верный признак
того, что вы стараетесь перенести бизнес логику из Команды (Command) вобработчик оповещений (notification) медиатора.

PureMVC является бесплатным фреймворком с открытым кодом от Futurescale, Inc.
Copyright © 2006-09. Некоторые права защищены. Использование ограничено лицензией Creative Commons 3.0.
Документация, обучающие материалы и примеры кода с сайта Futurescale’s предоставляются «как есть», без всяких
гарантий и включая, но, не ограничиваясь ими, подразумеваемые гарантии пригодности для целей, или гарантий
ненарушения прав. Implementation Idioms & Best Practices.doc

29Медиаторы
Обработка оповещений в Медиаторе
override public function handleNotification( note : INotification ) : void {switch ( note.getName() ) {case ApplicationFacade.SEARCH_FAILED:
controlBar.status = AppControlBar.STATUS_FAILED;
controlBar.searchText.setFocus();break;
case ApplicationFacade.SEARCH_SUCCESS:
controlBar.status = AppControlBar.STATUS_SUCCESS;
break;}}}

Практика показывает, что лучше всего обрабатывать 4-5 оповещений водном обработчике.
Если оповещений больше, желательно разбить этот обработчик нанесколько менее громоздких. Создавая медиаторы для отдельных
компонентов Представления, можно избежать накопления оповещений водном обработчике.
Использование единого, заранее определенного метода оповещения,является главной отличительной чертой Медиатора, как он обрабатывает
события и оповещения.
Для событий мы можем определить целый ряд обработчиков, но обычно длякаждого события есть свой единственный обработчик. Эти методы недолжны быть слишком сложными, или заниматься слишком мелкими
задачами по работе с каждым компонентом Представления, поскольку
Представление должен быть написан так, чтобы включать в себя детали
своей реализации, предоставляя Медиатору четко разделенный понаправлениям интерфейс.

PureMVC является бесплатным фреймворком с открытым кодом от Futurescale, Inc.
Copyright © 2006-09. Некоторые права защищены. Использование ограничено лицензией Creative Commons 3.0.
Документация, обучающие материалы и примеры кода с сайта Futurescale’s предоставляются «как есть», без всяких
гарантий и включая, но, не ограничиваясь ими, подразумеваемые гарантии пригодности для целей, или гарантий
ненарушения прав. Implementation Idioms & Best Practices.doc

30Медиаторы
Обработка оповещений в Медиаторе
Используя Оповещения, у вас есть единственный метод-обработчик, вкотором вы обрабатываете все Оповещения нужные для Медиатора.
Лучше всего обрабатывать все оповещения в одном методе, используя
switch конструкцию для различия оповещения по именам.
Было много обсуждений по поводу использования switch конструкции,многие разработчики считают, что эта конструкция ограничивает одним
способом обработки. Однако рекомендуемая практика это использования
одного метода обработчика оповещения и switch-конструкция.
Медиатор является
частью системы.

посредником

междуПредставлением

иостальной

Рассмотрим роль переводчицы беседы между послом и остальными членами
конференции ООН. Она редко делает что-либо большее чем перевод иполучение сообщений, разве что иногда подбирая подходящие метафорыили факты. Тоже самое можно сказать о роли Медиатора в рамках PureMVC.
Связка Медиатора с Прокси и другими МедиаторамиВ конечном счете, Представление наполняется данными Модели дляграфического их отображения, взаимодействия с данными через Прокси.
Представление должно знать о Модели, но Модель, в свою очередь, недолжна знать о Представлении.

PureMVC является бесплатным фреймворком с открытым кодом от Futurescale, Inc.
Copyright © 2006-09. Некоторые права защищены. Использование ограничено лицензией Creative Commons 3.0.
Документация, обучающие материалы и примеры кода с сайта Futurescale’s предоставляются «как есть», без всяких
гарантий и включая, но, не ограничиваясь ими, подразумеваемые гарантии пригодности для целей, или гарантий
ненарушения прав. Implementation Idioms & Best Practices.doc

31Медиаторы
Связка Медиатора с Прокси и другими Медиаторами
Медиатор может легко получить доступ к Прокси через Модель и читать иманипулировать данными, используя программный интерфейс Прокси. Есливыполнять те же операции с помощью Команд, будет потеряна связь между
Моделью и Представлением.
Так же Медиатор может получить ссылки на другие Медиаторы изПредставления и манипулировать данным уже из других Медиаторов.
Однако это не очень хорошая практика, потому что может привести кзависимости между частями Представления, что негативно повлияет нарефакторинг одной части Представления без затрагивания других частей.
Медиатор, желающий взаимодействовать с другим областям Представления,должен послать Оповещение, а не манипулировать Представлением
напрямую.
Медиатор не должен раскрывать методы для манипулирования своими
компонентами - вместо этого он должен отвечать на оповещения ивыполнять свою работу.
Если большая часть поведения Компонентов Представления реализована вМедиаторе (в ответ на Событие или Оповещение), желательно часть из нихперенести в само Представление, так чтобы в дальнейшем можно былоповторно использовать.
Если большинство взаимодействий с Прокси или их данными реализованы вМедиаторе, перенос этой функциональности в Команду упростит Медиатор.
Также перенос бизнес логики в Команды позволяет использовать еедругими Представлениями без потери связки Представление – Модель.

PureMVC является бесплатным фреймворком с открытым кодом от Futurescale, Inc.
Copyright © 2006-09. Некоторые права защищены. Использование ограничено лицензией Creative Commons 3.0.
Документация, обучающие материалы и примеры кода с сайта Futurescale’s предоставляются «как есть», без всяких
гарантий и включая, но, не ограничиваясь ими, подразумеваемые гарантии пригодности для целей, или гарантий
ненарушения прав. Implementation Idioms & Best Practices.doc

32Медиаторы
Взаимодействие пользователя с Представлением и Медиаторами
Рассмотрим компонент LoginPanel, представляющий собой форму. Этому
компоненту будет соответствовать Медиатор LoginPanelMediator, который
будет взаимодействовать с нашей формой и отвечать на попытку войти всистему.
Взаимодействие компонента LoginPanel и Медиатора LoginPanelMediatorзаключается в том, что компонент отсылает событие TRY_LOGIN, когда
пользователь ввел логин/пароль и нажал на кнопку Login. Медиатор
LoginPanelMediator обрабатывает событие, отсылая Оповещение свведенными данными (логином и паролем сохраненный в объекте LoginVO).
LoginPanel.mxml:<?xml version="1.0" encoding="utf-8"?><mx:Panel xmlns:mx="http://www.adobe.com/2006/mxml" title="Login" status=”{loginStatus}”><!—Событие вещаемое компонентом.
К сожалению мы не можем использовать имя константы, так как MetaData является директивой
компилятора
--><mx:MetaData>[Event('tryLogin')];</mx:MetaData><mx:Script><![CDATA[

import com.me.myapp.model.vo.LoginVO;// поля формы привязаны к свойствам объекта
[Bindable] public var loginVO:LoginVO = new LoginVO();[Bindable] public var loginStatus:String = NOT_LOGGED_IN;]]>// задаем константы в Представлении для событий
public static const TRY_LOGIN:String='tryLogin';public static const LOGGED_IN:String='Logged In';
public static const NOT_LOGGED_IN:String='Enter Credentials';</mx:Script>
PureMVC является бесплатным фреймворком с открытым кодом от Futurescale, Inc.
Copyright © 2006-09. Некоторые права защищены. Использование ограничено лицензией Creative Commons 3.0.
Документация, обучающие материалы и примеры кода с сайта Futurescale’s предоставляются «как есть», без всяких
гарантий и включая, но, не ограничиваясь ими, подразумеваемые гарантии пригодности для целей, или гарантий
ненарушения прав. Implementation Idioms & Best Practices.doc

33Медиаторы
Взаимодействие пользователя с Представлением и Медиаторами
<mx:Binding source="username.text" destination="loginVO.username"/><mx:Binding source="password.text" destination="loginVO.password"/><!—The Login Form --><mx:Form id="loginForm" ><mx:FormItem label="Username:"><mx:TextInput id="username" text="{loginVO.username}" /></mx:FormItem><mx:FormItem label="Password:"><mx:TextInput id="password" text="{loginVO.password}" displayAsPassword="true" /></mx:FormItem><mx:FormItem ><mx:Button label="Login" enabled="{loginStatus == NOT_LOGGED_IN}”
click="dispatchEvent( new Event(TRY_LOGIN, true ));"/></mx:FormItem></mx:Form>Компонент LoginPanel заполняет объект LoginVO данным введенные
пользователем и, когда он нажимает кнопку «Login», отправляется событие
TRY_LOGIN. Затем за дело берется Медиатор LoginPanelMediator.
Это позволяет компоненту только собирать данные и оповестить систему оготовности.
Для того чтобы избежать случаев отправки пустых значений в полях
объекта LoginVO, можно активировать кнопку «Login» только в случае еслиполя логин и пароль заполнены.
Вся логика компонента находится в Медиаторе, где обрабатывается
событие
TRY_LOGIN,проверяются
значения
полей
LoginVOиустанавливается значение свойства status компонента LoginPanel.
Mедиатор LoginPanelMediator также будет отвечать за обработку
оповещений LOGIN_FAILED и LOGIN_SUCCESS и будет выставлять значение
свойства status.

PureMVC является бесплатным фреймворком с открытым кодом от Futurescale, Inc.
Copyright © 2006-09. Некоторые права защищены. Использование ограничено лицензией Creative Commons 3.0.
Документация, обучающие материалы и примеры кода с сайта Futurescale’s предоставляются «как есть», без всяких
гарантий и включая, но, не ограничиваясь ими, подразумеваемые гарантии пригодности для целей, или гарантий
ненарушения прав. Implementation Idioms & Best Practices.doc

34Медиаторы
Взаимодействие пользователя с Представлением и Медиаторами
LoginPanelMediator.as:package com.me.myapp.view {import flash.events.Event;import org.puremvc.as3.interfaces.*;
import org.puremvc.as3.patterns.mediator.Mediator;
import com.me.myapp.model.LoginProxy;
import com.me.myapp.model.vo.LoginVO;
import com.me.myapp.ApplicationFacade;import com.me.myapp.view.components.LoginPanel;// Медиатор взаимодействующий с Компонентом LoginPanelpublic class LoginPanelMediator extends Mediator implements IMediator {public static const NAME:String = 'LoginPanelMediator';
public function LoginPanelMediator( viewComponent:LoginPanel ) {super( NAME, viewComponent );loginPanel.addEventListener( LoginPanel.TRY_LOGIN, onTryLogin );}// Список подписанных Оповещений
override public function listNotificationInterests( ) : Array {return [LoginProxy.LOGIN_FAILED,
LoginProxy.LOGIN_SUCCESS];}// Обработка Оповещений
override public function handleNotification( note:INotification ):void {switch ( note.getName() ) {case LoginProxy.LOGIN_FAILED:
loginPanel.loginVO = new LoginVO( );loginPanel.loginStatus = LoginPanel.NOT_LOGGED_IN;
break;

PureMVC является бесплатным фреймворком с открытым кодом от Futurescale, Inc.
Copyright © 2006-09. Некоторые права защищены. Использование ограничено лицензией Creative Commons 3.0.
Документация, обучающие материалы и примеры кода с сайта Futurescale’s предоставляются «как есть», без всяких
гарантий и включая, но, не ограничиваясь ими, подразумеваемые гарантии пригодности для целей, или гарантий
ненарушения прав. Implementation Idioms & Best Practices.doc

35Медиаторы
Взаимодействие пользователя с Представлением и Медиаторами

}}case LoginProxy.LOGIN_SUCCESS:
loginPanel.loginStatus = LoginPanel.LOGGED_IN;
break;// Пользователь пытается войти кликая кнопку Loginprivate function onTryLogin ( event:Event ) : void {sendNotification( ApplicationFacade.LOGIN, loginPanel.loginVO );}}}// Приведение типа Представление к конкретному типуprotected function get loginPanel() : LoginPanel {return viewComponent as LoginPanel;}Следует отметить, что Медиатор LoginPanelMediator в своем конструкторе,связывает событие TRY_LOGIN и метод onTryLogin, который будет
обрабатывать это событие. Таким образом, метод onTryLogin будет вызван,когда пользователь кликнет на кнопку «Login». В самом же методе
onTryLogin отсылается Оповещение вместе с заполненным объектом
LoginVO.
Ранеемызарегистрировали
команду
LoginCommand
для
этого
Оповещения. Эта команда будет вызывать метод login Прокси LoginProxy,передавая объект LoginVO. Прокси LoginProxy попытается авторизоваться спомощью удаленного сервиса (remote service) и отослать оповещения
LOGIN_SUCCESS или LOGIN_FAILED. Эти классы определены в конце
раздела, посвященного Прокси.
Медиатор LoginPanelMediator имеет список заинтересованных оповещений,в который входят LOGIN_SUCCESS и LOGIN_FAILED. Поэтому, независимоот результата, Медиатор будет оповещен и присвоит значение LOGGED_INпеременной loginStatus (компонент LoginPanel) в случаи успеха, иначе NOT_LOGGED_IN и очистит объект LoginVO.
PureMVC является бесплатным фреймворком с открытым кодом от Futurescale, Inc.
Copyright © 2006-09. Некоторые права защищены. Использование ограничено лицензией Creative Commons 3.0.
Документация, обучающие материалы и примеры кода с сайта Futurescale’s предоставляются «как есть», без всяких
гарантий и включая, но, не ограничиваясь ими, подразумеваемые гарантии пригодности для целей, или гарантий
ненарушения прав. Implementation Idioms & Best Practices.doc

36Прокси
Вообще говоря, паттерн Прокси (Proxy, далее Прокси) используется дляобеспечения хранения любого объекта в целях контроля доступа к нему. Вприложениях, основанных на PureMVC, класс Proxy используется
специально для управления частями Модели Данных приложения.
Прокси могут управлять доступом к созданным локально структурам
данных произвольной сложности. Они называются Объектами Данных
Прокси (Proxy’s Data Object).
В этом случае, идиома для взаимодействия с Прокси связана с синхронной
установкой (setting) и получением (getting) данных. Объекты Данных могут
подвергаться полному или частичному обновлению свойств, или же может
меняться ссылка на сам Объект Данных. Когда выполняются методы дляобновления данных, Прокси может отправлять Оповещение в остальную
часть системы, что его данные изменились.
Прокси Удаленного Сервиса (Remote Proxy, далее Прокси Удаленного
Сервиса) используется для инкапсуляции взаимодействия с удаленными
сервисами, для сохранения или получения данных. Прокси может хранить
объект, который взаимодействует с удаленным сервисом, а также
контролировать доступ к данным, переданным и полученным от этого
сервиса.
Таким образом, можно просто устанавливать данные или же вызывать
методы Прокси и дожидаться асинхронного Оповещения, отправляемого
Прокси когда данные от удаленного сервиса получены.
Обязанности конкретного Прокси
Конкретные Прокси позволяют нам инкапсулировать фрагменты модели
данных, независимо откуда они получены и их типа, а так же необходимыдля управления Объектами Данных и организации доступа приложения кним.

PureMVC является бесплатным фреймворком с открытым кодом от Futurescale, Inc.
Copyright © 2006-09. Некоторые права защищены. Использование ограничено лицензией Creative Commons 3.0.
Документация, обучающие материалы и примеры кода с сайта Futurescale’s предоставляются «как есть», без всяких
гарантий и включая, но, не ограничиваясь ими, подразумеваемые гарантии пригодности для целей, или гарантий
ненарушения прав. Implementation Idioms & Best Practices.doc

37Реализация класса Прокси, который входит в PureMVC, является простым
контейнером для Объектов Данных, и может быть зарегистрирована вМодели.

PureMVC является бесплатным фреймворком с открытым кодом от Futurescale, Inc.
Copyright © 2006-09. Некоторые права защищены. Использование ограничено лицензией Creative Commons 3.0.
Документация, обучающие материалы и примеры кода с сайта Futurescale’s предоставляются «как есть», без всяких
гарантий и включая, но, не ограничиваясь ими, подразумеваемые гарантии пригодности для целей, или гарантий
ненарушения прав. Implementation Idioms & Best Practices.doc

38Прокси
Обязанность конкретного прокси
Чтобы полностью использовать возможности в данной форме, мы, обычно,создаем подкласс класса Proxy и добавляем функциональность,характерную для конкретного Прокси.
Общие варианты использования Прокси включают в себя:o Прокси Удаленного Сервиса - данные, управляемые конкретным
Прокси, находится на удаленном сервере, и могут быть доступны
через удаленный сервис.
o Прокси и Делегат (Proxy and Delegate) - доступ к объекту,обеспечивающему удаленный доступ, должен быть распределен
между несколькими Прокси. Класс Делегат поддерживает объект
удаленного доступа и контролирует доступ к нему, обеспечивая
передачу ответов тем, кто послал запрос.
o Защищенный Прокси (Protection Proxy) - используется когда игроки
системы должны иметь разные права доступа к Объекту Данных.
o Виртуальный Прокси - создает Объекты Данных по запросу.
o Умный Прокси - загружает объекты данных в память при первом
доступе, осуществляет ведение учета ссылок, позволяет блокировать
объект, чтобы другой объект не смог изменить его.
Неявное приведения типа объекта данных
Реализация базового класса Proxy, которая поставляется с PureMVCпринимает имя Прокси и основной Объект Данных в качестве аргумента
конструктора.
Выможете
динамически
устанавливать Объект
Данных Прокси после того, как он создан, вызывая метод setData.

PureMVC является бесплатным фреймворком с открытым кодом от Futurescale, Inc.
Copyright © 2006-09. Некоторые права защищены. Использование ограничено лицензией Creative Commons 3.0.
Документация, обучающие материалы и примеры кода с сайта Futurescale’s предоставляются «как есть», без всяких
гарантий и включая, но, не ограничиваясь ими, подразумеваемые гарантии пригодности для целей, или гарантий
ненарушения прав. Implementation Idioms & Best Practices.doc

39Прокси
Неявное приведения типа объекта данныхКак и в случае с Медиатором и его Компонентом Представления, вы будете
часто приводить Объект Данных к фактическому типу, для того, чтобы
получить доступ к свойствам и методам, которые он предоставляет; этоутомительная и однообразная практика, но следование идиомам позволяют
открывать больше о реализации Объекта Данных, чем это может
потребоваться.
Кроме того, поскольку Объект Данных обычно имеет сложную структуру,часто необходимо иметь под рукой ссылки на несколько частей структуры,в дополнении к приведенной к типу ссылки на всю структуру.
В языке ActionScript функции называемые неявными геттерами (getters) исеттерами (setter) оказываются очень полезными в решении приведения
типа и устранении проблем неуместного применения типов.
Полезная практика - использовать в конкретном Прокси неявный getter,который возвращает Объект Данных фактического типа и имеет
осмысленное название.
Дополнительно, вы можете указать несколько геттеров, возвращающих
определенные части Объекта Данных.
Например:public function get searchResultAC () : ArrayCollection {return data as ArrayCollection;}
public function get resultEntry( index:int ) : SearchResultVO {return searchResultAC.getItemAt( index ) as SearchResultVO;}

PureMVC является бесплатным фреймворком с открытым кодом от Futurescale, Inc.
Copyright © 2006-09. Некоторые права защищены. Использование ограничено лицензией Creative Commons 3.0.
Документация, обучающие материалы и примеры кода с сайта Futurescale’s предоставляются «как есть», без всяких
гарантий и включая, но, не ограничиваясь ими, подразумеваемые гарантии пригодности для целей, или гарантий
ненарушения прав. Implementation Idioms & Best Practices.doc

40Прокси
Неявное приведения типа объекта данныхВ каком-то Медиаторе вам пришлось бы делать так:var item:SearchResultVO = ArrayCollection ( searchProxy.getData() ).lastResult.getItemAt( 1 ) as SearchResultVO;Однако, используя практику, описанную выше, можно сделать так:var item:SearchResultVO = searchProxy.resultEntry( 1 );Запрет на привязку к медиаторамУ Прокси не запрашивают список интересующих его Оповещений как уМедиатора, да он и не получает Оповещений, потому что он не должен
заботиться о состоянии Вида. Вместо этого Прокси предоставляет методы исвойства, позволяющие другим участникам манипулировать им.
Конкретный Прокси не должен извлекать и использовать Медиаторы длятого, чтобы информировать систему об изменении своего Объекта Данных.
Вместо этого Прокси должен отправлять Оповещения, которые получат
Команды или Медиаторы. От Прокси не должно зависеть, как этиОповещения повлияют на систему.
В связи с тем, что уровень Модели Данных не содержит каких-либо знанийо системе реализации, уровни Представления и Контроллера могут бытьотрефакторены без вмешательства в уровень Модели Данных.
Обратное не совсем верно. Очень трудно изменить уровень Модели
Данных, не изменяя уровень Представления и, скорее всего, уровень
Контроллера. В конце концов, эти уровни существуют только чтобы
позволить пользователю взаимодействовать с уровнем Модели Данных.

PureMVC является бесплатным фреймворком с открытым кодом от Futurescale, Inc.
Copyright © 2006-09. Некоторые права защищены. Использование ограничено лицензией Creative Commons 3.0.
Документация, обучающие материалы и примеры кода с сайта Futurescale’s предоставляются «как есть», без всяких
гарантий и включая, но, не ограничиваясь ими, подразумеваемые гарантии пригодности для целей, или гарантий
ненарушения прав. Implementation Idioms & Best Practices.doc

41Прокси
Инкапсуляция предметной области в прокси
Изменения на уровне Модели Данных почти всегда приводит к некоторому
рефакторингу уровней Контроллера и Представления.
Мы увеличили разделение между уровнем Модели Данных и общих
интересов уровней Представления и Контроллера путем максимального
перемещения предметной области в Прокси.
Прокси может использоваться не только для контроля доступа к данным, нои выполнять операции над данными, которые могут быть необходимы дляподдержания некоторого их валидного состояния.
Например, расчет налога с продаж является функцией предметной областии поэтому она должна находится в Прокси, а не в Медиаторе или Команде.
Несмотря на то, что эта функция может быть реализована в любом из этихмест, размещение её в Прокси не только логично, но и облегчает другие
уровни и упрощает рефакторинг.
Медиатор может получить Прокси; вызвать функцию вычисления налога спродаж, и возможно, поместить результат в какую-либо форму. Норазмещение фактического расчета в Медиаторе реализует в нем, с точки
зрения уровня, Предметную Область. Вычислений налога является
правилом относящемся к Предметной Области. Представлению оно может
быть известно как свойство Предметной Области, доступное, еслисоответствующий Объект Данных присутствует.
Представьте, что вы в настоящее время работаете над RIA приложениемдля запуска в размерах рабочего стола персонального компьютера. Новая
версия должна запускаться на КПК с соответствующим разрешением ссокращением сценариев использования, но по-прежнему использовать
полную Модель Данных существующего приложения.
PureMVC является бесплатным фреймворком с открытым кодом от Futurescale, Inc.
Copyright © 2006-09. Некоторые права защищены. Использование ограничено лицензией Creative Commons 3.0.
Документация, обучающие материалы и примеры кода с сайта Futurescale’s предоставляются «как есть», без всяких
гарантий и включая, но, не ограничиваясь ими, подразумеваемые гарантии пригодности для целей, или гарантий
ненарушения прав. Implementation Idioms & Best Practices.doc

42Прокси
Инкапсуляция предметной области в проксиПри правильном разделении интересов, мы можем использовать уровень
Модели Данных во всей ее полноте и просто подгонять новые уровни
Представления и Контролера к нему.
Размещение фактического расчета налога с продаж в Медиаторе может
показаться эффективным и простым в момент реализации; например, вытолько что получили данные из формы, и вы хотите рассчитать налог спродаж, и отправить его в Модель уже вычисленным.
Однако в каждой версии своего приложения вам теперь придется
дублировать ваши усилия или копировать код вычисления налога с продажв новый, совершенно другой уровень Представления, хотя эта логика моглабы появляться автоматически, как часть вашей Модели Данных.

Взаимодействие с Прокси Удаленного Сервиса
Прокси Удаленного Сервиса - это обычный Прокси, который получает своиОбъекты Данных из удаленного местоположения. Это значит, что мывзаимодействуем с ним в асинхронном режиме.
Каким образом Прокси получает данные - зависят от платформы клиента,реализации
удаленного
взаимодействия,атакжепредпочтений
разработчиков. В Flash / Flex мы можем использовать HTTPService,
WebService, RemoteObject, DataService или XMLSocket для осуществления
запросов из Прокси.

PureMVC является бесплатным фреймворком с открытым кодом от Futurescale, Inc.
Copyright © 2006-09. Некоторые права защищены. Использование ограничено лицензией Creative Commons 3.0.
Документация, обучающие материалы и примеры кода с сайта Futurescale’s предоставляются «как есть», без всяких
гарантий и включая, но, не ограничиваясь ими, подразумеваемые гарантии пригодности для целей, или гарантий
ненарушения прав. Implementation Idioms & Best Practices.doc

43Прокси
Взаимодействие с Прокси Удаленного СервисаВ зависимости от потребностей, удаленный Прокси может направлять
запросы динамически, в ответ на вызов сеттеров или методов; или жеможет делать единственный запрос во время создания и обеспечивать
доступ к данным впоследствии.
Есть ряд оптимизаций, которые могут быть применены в Прокси дляповышения эффективности взаимодействия с удаленной службой.
Прокси может кешировать данные, и, таким образом, сократить количество
запросов в сеть, или же отсылать обновления только тех частей структуры
данных, которые были изменены, уменьшая сетевой трафик.
Если запрос динамически вызывается на Прокси Удаленного Сервиса
другим игроком в системе, Прокси необходимо отправить Оповещение,когда будет получен ответ.
Заинтересованным в получении Оповещения может быть или не быть тотже игрок, что и инициировал запрос.
Например, для осуществления процесса поиска, происходящего наудаленном сервере и отображения результатов, возможна следующая
последовательность действия:o Представление инициирует поиск вызовом события (Event).
o Его Медиатор получает соответствующий
устанавливает свойство "критерии поиска".

удаленный

проксииo Свойство "критерий поиска" в Прокси - это на самом деле неявный
сеттер, который сохраняет значение и инициирует поиск запросом
через внутренний HTTPService, у которого ожидает событий Result
или Fault.

PureMVC является бесплатным фреймворком с открытым кодом от Futurescale, Inc.
Copyright © 2006-09. Некоторые права защищены. Использование ограничено лицензией Creative Commons 3.0.
Документация, обучающие материалы и примеры кода с сайта Futurescale’s предоставляются «как есть», без всяких
гарантий и включая, но, не ограничиваясь ими, подразумеваемые гарантии пригодности для целей, или гарантий
ненарушения прав. Implementation Idioms & Best Practices.doc

44Прокси
Взаимодействие с Прокси Удаленного Сервисаo После того, как HTTPService получает ответ, он вызывает ResultEvent,который получает Прокси чтобы установить результаты поиска, каксвое публичное свойство.
o Затем Прокси отправляет Оповещение, информирующее об успехе
поиска и содержащее ссылку на свой Объект Данных в качестве
тела Оповещения.
o Другой
Медиатор,выразивший
заинтересованность
вэтомОповещении, и, соответственно, принимающий его, устанавливает
тело Оповещения как dataProvider своего Компонента Представления.
Или же рассмотрим LoginProxy, который содержит LoginVO (Value Object;простой класс-контейнер данных). LoginVO может выглядеть так:package com.me.myapp.model.vo {// Привязка модели к «серверному классу»[RemoteClass(alias="com.me.myapp.model.vo.LoginVO")]}[Bindable]
public class LoginVO {public var username: String;
public var password: String;
public var authToken: String; // устанавливается сервером если авторизация пройдена
}LoginProxy содержит методы для установления полномочий, входа и выхода
пользователя, и получения метки авторизации, которая будет включена впоследующие удаленные вызовы для опознания пользователя в данной
конкретной схеме аутентификации.

PureMVC является бесплатным фреймворком с открытым кодом от Futurescale, Inc.
Copyright © 2006-09. Некоторые права защищены. Использование ограничено лицензией Creative Commons 3.0.
Документация, обучающие материалы и примеры кода с сайта Futurescale’s предоставляются «как есть», без всяких
гарантий и включая, но, не ограничиваясь ими, подразумеваемые гарантии пригодности для целей, или гарантий
ненарушения прав. Implementation Idioms & Best Practices.doc

45Прокси
Взаимодействие с Прокси Удаленного Сервиса LoginProxy:
package com.me.myapp.model {import mx.rpc.events.FaultEvent;import mx.rpc.events.ResultEvent;import mx.rpc.remoting.RemoteObject;import org.puremvc.as3.interfaces.*;
import org.puremvc.as3.patterns.proxy.Proxy;
import com.me.myapp.model.vo.LoginVO;// Прокси для авторизации пользователя
public class LoginProxy extends Proxy implements IProxy {public static const NAME:String = 'LoginProxy';public static const LOGIN_SUCCESS:String = 'loginSuccess';public static const LOGIN_FAILED:String = 'loginFailed';
public static const LOGGED_OUT:String = 'loggedOut';private var loginService: RemoteObject;public function LoginProxy () {super( NAME, new LoginVO ( ) );loginService = new RemoteObject();loginService.source = "LoginService";loginService.destination = "GenericDestination";loginService.addEventListener( FaultEvent.FAULT, onFault );loginService.login.addEventListener( ResultEvent.RESULT, onResult );}// Приведение типа объекта к конкретному классу
public function get loginVO( ) : LoginVO {return data as LoginVO;}// Пользователь авторизирован если authToken установлен
public function get loggedIn():Boolean {return ( authToken != null );}// подвызов, возвращающий строку авторизации после логина
public function get authToken():String {return loginVO.authToken;}

PureMVC является бесплатным фреймворком с открытым кодом от Futurescale, Inc.
Copyright © 2006-09. Некоторые права защищены. Использование ограничено лицензией Creative Commons 3.0.
Документация, обучающие материалы и примеры кода с сайта Futurescale’s предоставляются «как есть», без всяких
гарантий и включая, но, не ограничиваясь ими, подразумеваемые гарантии пригодности для целей, или гарантий
ненарушения прав. Implementation Idioms & Best Practices.doc

46Прокси
Взаимодействие с Прокси Удаленного Сервиса
// Установка имени/пароля и вход, либо выход и еще одна попытка
public login( tryLogin:LoginVO ) : void {if ( ! loggedIn ) {loginVO.username= tryLogin.username;loginVO.password = tryLogin.password;} else {logout();login( tryLogin );}}// для выхода используется пустой объект LoginVO
public function logout( ) : void {if ( loggedIn ) loginVO = new LoginVO( );sendNotification( LOGGED_OUT );}// Оповещение системы о том что вход прошел успешно
private function onResult( event:ResultEvent ) : void {setData( event.result ); // immediately available as loginVO
sendNotification( LOGIN_SUCCESS, authToken );}}}// Оповещение системы о том что вход завершился неудачей
private function onFault( event:FaultEvent) : void {sendNotification( LOGIN_FAILED, event.fault.faultString );}LoginCommand может получить LoginProxy, установить полномочия, а также
вызвать метод входа пользователя, инициировав удаленный запрос.
GetPrefsCommand может ответить на уведомление LOGIN_SUCCESS,получить authToken тела уведомления и вызвать следующий запрос,который вернет какие-то свойства или настройки пользователя.

PureMVC является бесплатным фреймворком с открытым кодом от Futurescale, Inc.
Copyright © 2006-09. Некоторые права защищены. Использование ограничено лицензией Creative Commons 3.0.
Документация, обучающие материалы и примеры кода с сайта Futurescale’s предоставляются «как есть», без всяких
гарантий и включая, но, не ограничиваясь ими, подразумеваемые гарантии пригодности для целей, или гарантий
ненарушения прав. Implementation Idioms & Best Practices.doc

47Прокси
Взаимодействие с Прокси Удаленного Сервиса
LoginCommand:
package com.me.myapp.controller {import org.puremvc.as3.interfaces.*;
import org.puremvc.as3.patterns.command.*;import com.me.myapp.model.LoginProxy;
import com.me.myapp.model.vo.LoginVO;}

public class LoginCommand extends SimpleCommand {override public function execute( note: INotification ) : void {var loginVO : LoginVO = note.getBody() as LoginVO;
var loginProxy: LoginProxy;loginProxy = facade.retrieveProxy( LoginProxy.NAME ) as LoginProxy;loginProxy.login( loginVO );}}GetPrefsCommand:
package com.me.myapp.controller {import org.puremvc.as3.interfaces.*;
import org.puremvc.as3.patterns.command.*;import com.me.myapp.model.LoginProxy;
import com.me.myapp.model.vo.LoginVO;}

public class GetPrefsCommand extends SimpleCommand {override public function execute( note: INotification ) : void {var authToken : String = note.getBody() as String;var prefsProxy : PrefsProxy;prefsProxy = facade.retrieveProxy( PrefsProxy.NAME ) as PrefsProxy;prefsProxy.getPrefs( authToken );}}AUTHOR: Cliff Hall <cliff@puremvc.org>

PureMVC является бесплатным фреймворком с открытым кодом от Futurescale, Inc.
Copyright © 2006-09. Некоторые права защищены. Использование ограничено лицензией Creative Commons 3.0.
Документация, обучающие материалы и примеры кода с сайта Futurescale’s предоставляются «как есть», без всяких
гарантий и включая, но, не ограничиваясь ими, подразумеваемые гарантии пригодности для целей, или гарантий
ненарушения прав. Implementation Idioms & Best Practices.doc

48