Pure MVC - Mediovski
-
Upload
tomek-binkowski -
Category
Technology
-
view
3.383 -
download
0
Transcript of Pure MVC - Mediovski
Spis Treści
1. Istota MVC2. Opis PureMVC
– Struktura plików– Istota obiektu Facade– Obiekty klasy Command– Obiekty klasy Proxy– Obiekty klasy Mediator– Obiekty klasy Notification
3. MultiCore 4. Zastosowanie
1. Zalety i Wady2. Przykłady aplikacji
2/24
Istota MVC
• Model – opisuje logikę aplikacji odpowiada za pobieranie danych z bazy danych, nic nie wie o widoku
• Widok – wyświetla dane przekazywane przez kontroler, nic nie wie o modelu
• Kontroler – reaguje na żądania użytkownika i wywołuje odpowiednie modele i przekazuje dane z modeli do widoku
3/24
2. Opis PureMVC
Pure MVC to „lekki” framework oparty na klasycznym wzorcu architektonicznym MVC.
•każdy obiekt z wzorca MVC (Model, Widok i Kontroler) jest Singletonem.
•wszystkie elementy MVC skupione są przez interfejs „Fasady”, który także jest Singletonem.
2. Opis PureMVC 5/24
2. Opis PureMVC 6/24
Komunikacja obiektów:
2.1. Struktura plików
controller – katalog z obiektami command
model – katalog z obiektami proxy oraz vo
view – katalog z obiektami mediator oraz pliki mxml (w przypadku Flex oraz Air)
7/24
2.2. Obiekt Fasady
• obiekt fasady stanowi centralne miejsce dostępu do publicznych metod.
• inicjalizuje i przechowuje główne elementy MVC (Command).
• dzięki fasadzie podstawowe obiekty Proxy, Mediator, Command mogą komunikować się między sobą w bardzo prosty sposób.
8/24
2.2. Obiekt Fasady 9/24
/** * Singleton ApplicationFacade */ public static function getInstance() : ApplicationFacade
{ if ( instance == null ) instance = new ApplicationFacade(
); return instance as ApplicationFacade; }
/** * Rejestruje obiekty command */ override protected function initializeController( ) : void { super.initializeController(); registerCommand( STARTUP, ApplicationStartupCommand ); } /**
* Start aplikacji**/
public function startup( app:CafeTownsend ):void { sendNotification( STARTUP, app ); }
2.2. Obiekt Fasady
Klasa fasady w swoim ciele zawiera listę statycznych zmiennych definiujących nazwy notyfikacji w systemie.
W przypadku dużego serwisu (nie korzystającego z multicore) takie umiejscowienie stałych może być bardzo kłopotliwe.
10/24
2.2. Obiekt Fasady 11/24
/** * Obiekt Fasady **/public class ApplicationFacade extends Facade{ public static const STARTUP:String = "startup"; public static const SHUTDOWN:String = "shutdown"; public static const APP_LOGOUT:String = "appLogout"; public static const APP_LOGIN:String = "appLogin"; public static const VIEW_EMPLOYEE_LOGIN:String= "viewEmployeeLogin"; public static const VIEW_EMPLOYEE_LIST:String= "viewEmployeeList"; public static const ADD_EMPLOYEE:String= "addEmployee"; public static const UPDATE_EMPLOYEE:String= "updateEmployee"; public static const SAVE_EMPLOYEE:String= "saveEmployee"; public static const DELETE_EMPLOYEE:String= "deleteEmployee";
public
2.3. Obiekt Command
• obiekt command zarejestrowany w fasadzie służy do komunikacji z mediatorami (modelami)
• obiekty te ułatwiają organizację całego systemu.
• najważniejszą częścią obiektu jest metoda „execute”, w której mogą być rejestrowane obiekty Proxy bądź Mediatory
12/24
2.3. Obiekt Command 13/24
/** * Rejestracja Proxy **/ override public function execute( note:INotification ) :void { facade.registerProxy(new EmployeeProxy()); facade.registerProxy(new UserProxy()); }
/** * Rejestracja Mediatorów i pobranie danych **/ override public function execute( note:INotification ) :void { facade.registerMediator( new ApplicationMediator( note.getBody() ) ); var employeeProxy:EmployeeProxy = facade.retrieveProxy( EmployeeProxy.NAME ) as EmployeeProxy; employeeProxy.loadEmployees();
sendNotification( ApplicationFacade.VIEW_EMPLOYEE_LOGIN ); }
2.4. Obiekt Proxy
• są to obiekty, które odpowiadają za całą logikę systemu.
• najczęściej stosowane są do pobierania/zapisywania danych.
• obiekt proxy implementuje interfejs Inotifier, dzięki któremu może wysyłać powiadomienia do systemu.
14/24
2.4. Obiekt Proxy 15/24
/** * Funkcja wywołująca obiekt pobierający dane **/public function loadEmployees():void{ var delegate : LoadEmployeesDelegate = new LoadEmployeesDelegate( this ); delegate.loadEmployeesService();}/** * Poprawne pobranie danych, wysyła notyfikację do systemu **/public function result( rpcEvent : Object ) : void{ data = rpcEvent.result.employees.employee as ArrayCollection; sendNotification( ApplicationFacade.LOAD_EMPLOYEES_SUCCESS );}
/** * Błąd podczas pobierania danych, wysyła notyfikację do systemu **/public function fault( rpcEvent : Object ) : void { data = new ArrayCollection(); errorStatus = "Could Not Load Employee List!"; sendNotification( ApplicationFacade.LOAD_EMPLOYEES_FAILED );}
2.5. Obiekt Mediator
• mediatory nasłuchują zdarzeń, które są wysyłane przez interfejs użytkownika poprzez obiekty Event.
• najważniejsze w mediatorze są metody:– listNotificationInterests – zwrace listę zdarzeń
jakie nasłuchuje mediator– handleNotification – handler obsługujący
poszczególne zdarzenia
• tak jak proxy implementuje interfejs Inotifier
16/24
2.5. Obiekt Mediator 17/24
override public function listNotificationInterests():Array { return [ ApplicationFacade.VIEW_EMPLOYEE_LOGIN, ApplicationFacade.VIEW_EMPLOYEE_LIST,
ApplicationFacade.VIEW_EMPLOYEE_DETAIL,ApplicationFacade.APP_LOGOUT,ApplicationFacade.UPDATE_EMPLOYEE];
}
override public function handleNotification( note:INotification ):void { switch ( note.getName() ) { case ApplicationFacade.VIEW_EMPLOYEE_LOGIN: app.vwStack.selectedIndex = EMPLOYEE_LOGIN; break;
case ApplicationFacade.VIEW_EMPLOYEE_LIST: employeeProxy.employee = null; app.vwStack.selectedIndex = EMPLOYEE_LIST; break; } }
2.6. Notification
• Obiekty Proxy, Mediatory and Command komunikują się poprzez wysyłanie bądź odbieranie notyfikacji:
– proxy może nadawać lecz nie może nasłuchiwać
– mediator nasłuchuje i może nadawać
– command są wywoływane przez notyfikacje i mogą generować notyfikacje
18/24
3. MultiCore
3. Multicore
• aplikacja podzielona jest na moduły
• każdy moduł posiada własny obiekt fasady oraz wszystkie elementy MVC zaimplementowane w wersji podstawowej PureMVC
• moduły działają niezależnie od siebie
• w przypadku fasad w trybie multicore pobranie instancji fasady odbywa się poprzez pobranie instancji danej fasady z tablicy
20/24
3. Multicore 21/24
/** * Pobranie instancji Fasady danej aplikacji **/public static function getInstance( key:String ) : ApplicationFacade { if ( instanceMap[ key ] == null ) instanceMap[ key ] = new ApplicationFacade( key ); return instanceMap[ key ] as ApplicationFacade; }
/** * Start aplikacji * * @param app referencja do modułu w aplikacji */ public function startup( app:Module1 ):void { sendNotification( STARTUP, app ); }
4. Zastosowanie
4.1. Zalety i Wady
Zalety– Pozwala utrzymać zrozumiałą strukturę aplikacji
– Automatyzacja w pisaniu (wystarczy napisać poprawnie komunikacje między mediatorem, commandsem i proxy
– Sprawdzi się przy dużych i średnich projektach
Wady– Zbyt duża liczba plików potrzebna do wywołania jednej akcji
– Przy małych projektach za dużo zajmuję wykonanie każdej akcji
– Obsługa eventów w mediatorach za pomocą switch-case
– Kłopotliwe umiejscowienie stałych definiujących notyfikacje
23/24
• http://exploringetfs.com/
• http://www.mercedes-benz.de/
• http://radus.com/
• http://minitask.org/
4.2. Przykłady aplikacji 24/24
K o n t a k tul. Wita Stwosza 40,02-661 Warszawa
tel. 22 646 76 84fax 22 856 51 01
e-mail: [email protected]
www.mediovski.pl