Это правильная реализация MVC в ActionScript 3? - PullRequest
6 голосов
/ 11 ноября 2011

Все, что делает программа, - вы нажимаете кнопку, и она сообщает, сколько раз вы нажимали кнопку в текстовом поле.

Класс документа: это точка входа в код.

package {
    import flash.display.MovieClip;

    /**
     * MVCTest.as
     * @author rotaercz
     */
    public class MVCTest extends MovieClip {
        private var _model:Model;
        private var _view:View;
        private var _control:Control;

        public function MVCTest() {
            _model = new Model();
            _view = new View(this);
            _control = new Control(_model, _view);
        }
    }
}

Класс модели: базовый код модели.

package {

    /**
     * Model.as
     * @author rotaercz
     */
    public class Model {
        private var _totalClicks:int;

        public function AddClick():void {
            _totalClicks++;
        }

        public function get Clicks():int {
            return _totalClicks;
        }

        public function Model() {
            _totalClicks = 0;
        }
    }
}

Класс управления: управляет вводом и обновлением модели и вида здесь.

package {
    import flash.events.MouseEvent;

    /**
     * Control.as
     * @author rotaercz
     */
    public class Control {
        private var _model:Model;
        private var _view:View;

        public function Control(model:Model, view:View):void {
            _model = model;
            _view = view;
            _view.addEventListener(MouseEvent.CLICK, OnClick);
        }

        private function OnClick(e:MouseEvent):void {
            _model.AddClick();
            _view.Text = "clicked " + _model.Clicks;
        }
    }
}

Класс просмотра: Theвизуальное представление программы.

package {
    import flash.display.MovieClip;
    import flash.events.EventDispatcher;
    import flash.events.MouseEvent;
    import flash.text.TextField;

    /**
     * View.as
     * @author rotaercz
     */
    public class View extends EventDispatcher {
        private var _parent:MovieClip;
        private var _button:MovieClip;

        private var _dt:TextField;

        public function set Text(s:String):void {
            _dt.text = s;
        }

        public function View(parent:MovieClip) {
            _parent = parent;
            _dt = _parent.getChildByName("dt") as TextField;
            _button = _parent.getChildByName("mcButton") as MovieClip;
            _button.addEventListener(MouseEvent.CLICK, OnClick);
        }

        private function OnClick(e:MouseEvent):void {
            dispatchEvent(e);
        }
    }
}

Ответы [ 3 ]

3 голосов
/ 11 ноября 2011

В традиционном паттерне MVC представление действительно имеет прямую зависимость от модели, как писал www0z0k, но я тоже думаю, что это не идеальное решение.

То, как вы настраиваете свой контроллер, действует как посредник между моделью и представлением, и это, безусловно, очень правильное решение.

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

Диаграмма: http://bit.ly/sTSDVT

Контроллер обновляет модель напрямую, но он также прослушивает центральный диспетчер событий для обновлений из модели (при необходимости) и транслирует их в представление. Он также слушает для просмотра событий

Модель зависит только от диспетчера событий и использует ее для отправки событий обновления.

Представление зависит только от диспетчера событий и прослушивает события обновления из модели. Он также отправляет свои собственные события. (Для этого можно использовать центральный диспетчер событий, но я бы не рекомендовал его)

1 голос
/ 11 ноября 2011

Я полагаю, что мое Введение в архитектуру приложения Flex - Redux будет весьма интересным для вас.

Для более быстрого подхода Flashy вы можете проверить FLit Framework . MVCSprite очень похож на ваше решение.

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

0 голосов
/ 11 ноября 2011
Контроллер

прислушивается к просмотру и обновлению модели, эта часть соответствует моему видению MVC.
но я пытался избежать включения контроллера в модель привязки для просмотра:

    _model = new Model();
    _view = new View(this, _model);
    _control = new Control(_model, _view);

в модели:

public class Model extends EventDispatcher{
    //............
    public function AddClick():void {
        _totalClicks++;
        dispatchEvent(new Event('one more click'));
    }

в поле зрения:

    private var _model:Model;
    public function View(parent:MovieClip, model:Model) {
        _parent = parent;
        _model = model;
        _model.addEventListener('one more click', update);
        _dt = _parent.getChildByName("dt") as TextField;
        _button = _parent.getChildByName("mcButton") as MovieClip;
        _button.addEventListener(MouseEvent.CLICK, OnClick);
    }

    private function update(e:Event):void{
        _dt.text = _model.clicks;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...