Модераторы: SoWa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Паттерны ООП, Observer, MVC 
:(
    Опции темы
AntonioBanderaz
Дата 31.10.2006, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Velichko Anton
**


Профиль
Группа: Участник
Сообщений: 851
Регистрация: 28.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 18



При проектировании приложений, а на Flash это RIA, часто возникает необходимость сообщить многим объектам какую либо информацию, сообщение. Для 
этого правильно испьзовать паттерн проектирования Observer. Паттерн проектирования Observer описывает отношение между объектами типа N к 1, и при 
изменении состояния одного происходит автоматическое уведомление и обновление всех зависящих от него объектов. 
Что нужно для базовой реализации паттерна. 

    1. Интерфейс Observer, имплементируют все слушатели
    2. Класс сообщения, объекты которого получают все слушатели.
    3. Класс Observable, класс регистрирующий слушателей и рассылающий сообщения.

Интерфейс Observer
Observer.as
Код

package com.avelichko.pattern.observer
{
    public interface Observer
    {
        public function update(o:Observable, msg:ObserverMessage):void;
    }
}



Класс сообщения ObserverMessage
ObserverMessage.as
Код

package com.avelichko.pattern.observer
{
    import com.avelichko.lang.util.exceptions.NullPointerException;
    
    public class ObserverMessage
    {
        private var _type:int = 0;
        private var _object:Object = null;
        
        public function set type(t:int):void {
            _type = t;
        }
        
        public function get type():int {
            return _type;
        }
        
        public function set msg(o:Object):void {
            if(o == null) {
                throw new NullPointerException("ObserverMessage must be not null");
            }
            _object = o;
        }
        
        public function get msg():Object {
            return _object;
        }
    }
}


Класс Observable
Observable.as
Код

package com.avelichko.pattern.observer
{
    import com.avelichko.lang.util.ArrayList;
    import com.avelichko.lang.util.Collection;
    import com.avelichko.lang.util.Iterator;
    import com.avelichko.lang.util.exceptions.NullPointerException;
    import com.avelichko.pattern.exceptions.DuplicateObserverException;
    
    public class Observable
    {
        
        private var inUse:Boolean = false;
        
        private var observersStack:Collection;
        private var observers:Collection;
        
        public function Observable() {
            observers = new ArrayList();
        }
        
        public function addObserver(o:Observer):void {
            
            if(o == null) {
                throw new NullPointerException("Observer object must be not null");
            }
            if(observers.contains(o)) {
                throw new DuplicateObserverException("Observer list already contains this observer");
            }
            if(inUse) {
                observersStack.add(o);
            } else {
                observers.add(o);
            }
        }
        
        public function removeObserver(o:Observer):void {
            var it:Iterator = observers.iterator();
            while(it.hasNext()) {
                var ob:Observer = it.next().valueOf();
                if(ob == o) {
                    it.remove();
                }
            }
        }
        
        public function notifyObservers(msg:ObserverMessage):void {
            if(!observersStack.isEmpty()) {
                var it:Iterator = observersStack.iterator();
                while(it.hasNext()) {
                    addObserver(it.next());
                }
            }
            
            inUse = true;
            
            var it:Iterator = observers.iterator();
            while(it.hasNext()) {
                var obs:Observer = it.next().valueOf();
                obs.update(this, msg);
            }
            
            inUse = false;
        }
        
        public function clearObservers():void {
            observers.clear();
            observersStack.clear();
        }
        
        public function countObservers():int {
            return observers.size() + observersStack.size();
        }
    }
}


Вспомогательный класс DuplicateObserverException
DuplicateObserverException.as
Код

package com.avelichko.pattern.exceptions
{
    public class DuplicateObserverException extends Error
    {
        public function DuplicateObserverException(message:String="", id:int=0)
        {
            super(message, id);
        }
        
    }
}



Собственно все, теперь надо идти к конкретной реализации этого паттерна, расширят класс Observable, имплементировать Observer, расширять 
ObserverMessage. Я привёл только базовую реализацию.

Теперь более сложный паттерн, так называемый mvc (Model-View-Controller). Иделогия mvc разделить обратную связь с пользователем, или неким 
интерфейсом разделены явно и обрабатываются тремя разными типами объектов. 
MVC состоит модели(Model) представления(View) и контроллера(Controller) 

    1. Модель - Хранит данные и логику интерфейса
    2. Представление - генерирует правльное визульное представление интерфейса.
    3. Контроллер - отвечает за вводимые данные, изменяя модель.

Не буду расписывать что-что делает думаю будет понятно, времени нет вообще, просто выложу классы.
Controller.as
Код

package com.avelichko.pattern.mvc
{
    import com.avelichko.pattern.observer.Observable;
    
    public interface Controller
    {
        function setModel(m:Observable):void;
        
        function getModel():Observable;
        
        function setView(v:View):void;
        
        function getView():View;
    }
}


View.as
Код

package com.avelichko.pattern.mvc
{
    import com.avelichko.pattern.observer.Observable;
    
    public interface View
    {
        function setModel(o:Observable):void;
        
        function getModel():Observable;
        
        function setController(c:Controller):void;
        
        function getController():Controller;
        
        function defaultController(model:Observable):Controller;
    }
}


AbstractController.as
Код

package com.avelichko.pattern.mvc
{
    import com.avelichko.pattern.observer.Observable;
    import com.avelichko.lang.util.exceptions.NullPointerException;

    public class AbstractController implements Controller
    {
        private var model:Observable = null;
        private var view:View = null;
        
        public function AbstractController(m:Observable) {
            setModel(m);
        }
        
        public function getView():View
        {
            return view;
        }
        
        public function setModel(m:Observable):void
        {
            if(m == null) {
                throw new NullPointerException("model must be not null");
            }
            model = m;
        }
        
        public function setView(v:View):void
        {
            if(v == null) {
                throw new NullPointerException("view must be not null");
            }
            view = v;
        }
        
        public function getModel():Observable
        {
            return model;
        }
        
    }
}


AbstractView.as
Код

package com.avelichko.pattern.mvc
{
    import com.avelichko.pattern.observer.Observer;
    import com.avelichko.pattern.observer.ObserverMessage;
    import com.avelichko.pattern.observer.Observable;
    import com.avelichko.lang.util.exceptions.NullPointerException;

    public class AbstractView implements Observer, View
    {
        
        private var model:Observable = null;
        private var controller:Controller = null;
        
        public function AbstractView(m:Observable, c:Controller = null) {
            if(o == null) {
                throw new NullPointerException("Model must be not null");
            }
            setModel(o);
            if(c != null) {
                setController(c);
            }
        }
        
        public function update(o:Observable, msg:ObserverMessage):void
        {

        }
        
        public function setModel(o:Observable):void
        {
            model = o;
        }
        
        public function getController():Controller
        {
            if(controller == null) {
                setController(defaultController(getModel()));
            }
            return controller;
        }
        
        public function getModel():Observable
        {
            return model;
        }
        
        public function defaultController(model:Observable):Controller
        {
            return null;
        }
        
        public function setController(c:Controller):void
        {
            if(c == null) {
                throw new NullPointerException("Controller must be not null");
            }
            controller = c;
            getController().setView(this);
        }
        
    }
}


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


--------------------
ГЫ... 
PM MAIL ICQ   Вверх
AlDev
Дата 31.10.2006, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный идиотъ
***


Профиль
Группа: Участник Клуба
Сообщений: 1927
Регистрация: 17.4.2005
Где: Irk, rus

Репутация: 10
Всего: 50



Дополню:
что такое MVC - читайте тут:
http://ru.wikipedia.org/wiki/MVC
PM MAIL WWW ICQ YIM MSN   Вверх
AntonioBanderaz
Дата 31.10.2006, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Velichko Anton
**


Профиль
Группа: Участник
Сообщений: 851
Регистрация: 28.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 18



Цитата(AntonioBanderaz @  31.10.2006,  11:55 Найти цитируемый пост)

Теперь более сложный паттерн, так называемый mvc (Model-View-Controller). Иделогия mvc разделить обратную связь с пользователем, или неким 
интерфейсом разделены явно и обрабатываются тремя разными типами объектов. 
MVC состоит модели(Model) представления(View) и контроллера(Controller) 

Лажанул... 

Теперь более сложный паттерн, так называемый mvc (Model-View-Controller). Иделогия mvc разделить обратную связь с пользователем, или неким интерфейсом. Они разделены явно и обрабатываются тремя разными типами объектов: модели(Model), представления(View) и контроллера(Controller).

Так наверно будет понятней.


--------------------
ГЫ... 
PM MAIL ICQ   Вверх
AlDev
Дата 1.11.2006, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный идиотъ
***


Профиль
Группа: Участник Клуба
Сообщений: 1927
Регистрация: 17.4.2005
Где: Irk, rus

Репутация: 10
Всего: 50



про Observer - а чем не устраивает EventDispatcher? =)
PM MAIL WWW ICQ YIM MSN   Вверх
AntonioBanderaz
Дата 1.11.2006, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Velichko Anton
**


Профиль
Группа: Участник
Сообщений: 851
Регистрация: 28.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 18



Цитата(AlDev @  1.11.2006,  09:35 Найти цитируемый пост)
про Observer - а чем не устраивает EventDispatcher? =) 

Да всем устраивает, просто Observer проще.

Там ошибочки в классах Observer были. Подправил.

Присоединённый файл ( Кол-во скачиваний: 1 )
Присоединённый файл  observer.rar 1,25 Kb


--------------------
ГЫ... 
PM MAIL ICQ   Вверх
AlDev
Дата 6.11.2006, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный идиотъ
***


Профиль
Группа: Участник Клуба
Сообщений: 1927
Регистрация: 17.4.2005
Где: Irk, rus

Репутация: 10
Всего: 50



так. терь про mvc - 
тут сильно кастрированый вариант smile 
PM MAIL WWW ICQ YIM MSN   Вверх
AntonioBanderaz
Дата 7.11.2006, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Velichko Anton
**


Профиль
Группа: Участник
Сообщений: 851
Регистрация: 28.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 18



Цитата(AlDev @  6.11.2006,  13:25 Найти цитируемый пост)
так. терь про mvc - 
тут сильно кастрированый вариант smile  

Всмысле кастрированый, что тебе тут не хватает?




--------------------
ГЫ... 
PM MAIL ICQ   Вверх
AlDev
Дата 7.11.2006, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный идиотъ
***


Профиль
Группа: Участник Клуба
Сообщений: 1927
Регистрация: 17.4.2005
Где: Irk, rus

Репутация: 10
Всего: 50



общение между m v и с. action-ы. Посмотри тот же struts smile
PM MAIL WWW ICQ YIM MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | ActionScript 3 | Следующая тема »


 




[ Время генерации скрипта: 0.1374 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.