这是ActionScript 3中MVC的正确实现吗?

rot*_*rcz 6 model-view-controller actionscript actionscript-3

所有程序都是单击一个按钮,它会告诉您在文本字段中单击按钮的次数.

文档类:这是代码的入口点.

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

型号类:基本型号代码.

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

控件类:控制模型的输入和更新,并在此处查看.

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

视图类:程序的可视化表示.

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Cre*_*ers 3

在传统的 MVC 模式中,视图确实像 www0z0k 所写的那样直接依赖于模型,但我也认为这不是一个理想的解决方案。

他们设置控制器的方式是充当模型和视图之间的中介,这当然是一个非常有效的解决方案。

但是,如果您希望从模型到视图进行更直接的通信(这会节省一些代码),您可以创建一个中央事件调度程序,将其传递给模型并让它们使用中央事件调度程序来调度其更新事件,然后还传递中央事件调度程序到视图,让视图直接监听模型调度的事件。这样视图就不会直接依赖于模型,但它仍然可以侦听它们发送的事件。在这种情况下,控制器只会将视图事件转换为模型。

图表: http: //bit.ly/sTSDVT

控制器直接更新模型,但它也侦听中央事件调度程序以获取来自模型的更新(如果需要)并将其转换为视图。它还监听视图事件

该模型仅依赖于事件调度程序并使用它来调度更新事件。

视图仅依赖于事件调度程序并侦听来自模型的更新事件。它也调度自己的事件。(您可以使用中央事件调度程序,但我不推荐它)