суббота, 29 ноября 2008 г.

Flex Cairngorm. Часть 1. Старт с использованием Model Locator

(перевод с англ.: Getting Started with Cairngorm – Part 1)

В Cairngorn используется паттерн Model Locator, но им одним Cairngorn не исчерпывается. Сначала мы рассмотрим преимущества использования данного паттерна.

Model Locator - это централизованный репозиторий для всех данных, имеющихся в вашем приложенн. Ваши данные располагаются в Синглтоне (см. паттерн Одиночка). Этот "класс" может иметь только один экземпляр. Почему это так важно? Покажем это на примере.

У нас есть замечательный мини-блокнот для работы, Я в него записываю все данные в течении рабочего дня. В определенный момент я потерял блокнот и купил себе новый, а потом и нашел старый. После я записывал в оба блокнота. Мне действительно тяжело найти запись, которую я сделал допустим неделю назад. Это простой пример - но представим что у меня 20 блокнотов? Это похоже на сумашествие.

Таким образом, мы получаем "класс", который будет инстанцирован 20 раз в вашем приложении. Самый простой способ обойти эту проблему - использовать паттерн Одиночка. Одиночка - это класс который никогда не создается традиционным способом. Его главное правило - не может существовать более одного экземпляра данного класса. Я покажу на примере, как его сделать.

ActionScript:
package net.davidtucker.CairngormSample.model {
import com.adobe.cairngorm.model.IModelLocator;
[Bindable]
public class ModelLocator implements IModelLocator {
// Single Instance of Our ModelLocator
private static var instance:ModelLocator;
public function ModelLocator(enforcer:SingletonEnforcer) {
if (enforcer == null) {
throw new Error( "You Can Only Have One ModelLocator" );
}
}
// Returns the Single Instance
public static function getInstance() : ModelLocator {
if (instance == null) {
instance = new ModelLocator( new SingletonEnforcer );
}
return instance;
}
//DEFINE YOUR VARIABLES HERE
}
}
// Utility Class to Deny Access to Constructor
class SingletonEnforcer {}

Код может показаться в начале сложным, но поверьте мне, что это не так сложно как кажется. Сначала идет определение пэкаджа и нескольких классов. Далее определение интерфейса IModelLocator, которое нам понадобится в дальнейшем. IModelLocator располагается в SWC Cairngorm которым можно скачать отсюда: http://labs.adobe.com/wiki/index.php/Cairngorm:Cairngorm2.2:Download. Стоит обратить внимание, что можно использовать Model Locator без Cairngon. Я это тоже делаю для небольших проектов. Для этого необходимо будет удалить строчки 'implements IModelLocator' и 'import com.adobe.cairngorm.model.IModelLocator' из кода паттерна Model Locator.

ActionScript:
[Bindable]
public class ModelLocator implements IModelLocator {
// Single Instance of Our ModelLocator
private static var instance:ModelLocator;

Теперь у нас есть определение класса. Важно использовать метатэг [Bindable] над определение класса. Это позволит использовать все определенные внутри класса переменные. Идем дальше. Мы создаем переменную instance, которая будет иметь тип Model Locator. В ней будет храниться экземпляр нашего класса. Он будет объявлен статическим. Вы не уверены, является ли данная переменная статической? На самом деле это нормально, мы обсудим это на следующем уроке.

ActionScript:
public function ModelLocator(enforcer:SingletonEnforcer) {
if (enforcer == null) {
throw new Error( "You Can Only Have One ModelLocator" );
}
}

После этого идет конструктор. В качестве аргумента enforcer типа SingletonEnforcer. Данный класс (SingletonEnforcer) определен после нашего класса. Это делается, потому что:

- когда вы пишете класс в файле ActionScript ниже основного класса, он доступен только для этого основного класса
- конструктор требует данный аргумент, но только наш класс может его создать, т.к. мы не имеем доступа к классу SingletonEnforcer. Только основной класс
- мы не можем создать класс директивой "new", потому что мы не можем выполнить конструктор. (Я покажу вам, как мы будем это делать).

В конструкторе несколько строк кода, которые гарантируют нормальное состояние. В секции IF проверяется валидность объекта "enforcer". Если он неправильный, генерируется сообщение об ошибке.

ActionScript:
// Returns the Single Instance
public static function getInstance() : ModelLocator {
if (instance == null) {
instance = new ModelLocator( new SingletonEnforcer );
}
return instance;
}

Функция "getInstance" дает доступ из приложения к ModelLocator. Эта функция просто берет единственный экземпляр класса, а если он не создан - создает его. Мы можем получить ModelLocator используя такой код:

ActionScript:
var model:ModelLocator = ModelLocator.getInstance();

Видеопример - Создание Адресной Книги в формате FLV:
http://www.davidtucker.net/swf/flv/cairngorm1.flv
Проигрыватель для FLV:
http://www.wimpyplayer.com/products/wimpy_standalone_flv_player.html

Исходники
http://www.davidtucker.net/airtips/ModelLocatorSample.zip

Комментариев нет: