pureMvc
- 格式:pdf
- 大小:466.94 KB
- 文档页数:44
puremvc框架解读PureMVC,如其名,是一个纯粹且小巧的MVC框架。
它基于模型、视图和控制器(MVC)的设计模式,为开发者提供了一种轻量级的解决方案,用于构建复杂的应用程序。
一、PureMVC的起源与特点PureMVC最初是为ActionScript 3语言设计的,用于Adobe Flex、Flash和AIR平台。
但随着时间的推移,PureMVC已经成功地移植到了几乎所有的主流开发平台。
其免费开源的特性,以及对于多语言的支持,使其成为许多开发者的首选框架。
二、PureMVC的核心组件PureMVC包含三个核心组件:模型(Model)、视图(View)和控制器(Controller),这三个组件合称为核心层或核心角色。
1. 模型(Model):负责处理应用程序的数据和业务逻辑。
2. 视图(View):负责呈现数据给用户,通常是与用户界面相关的代码。
3. 控制器(Controller):负责处理用户的输入,协调模型和视图之间的交互。
三、PureMVC的版本与使用PureMVC支持两个版本:标准版和多核版。
标准版提供了一种简单的编码分离方法,按照MVC设计概念进行组织。
多核版则提供了更强大的功能和扩展性,适合大型和复杂的项目。
四、PureMVC的实践与应用使用PureMVC框架,开发者可以更高效地构建出结构清晰、易于维护的应用程序。
由于其轻量级的特点,PureMVC特别适合于快速原型设计和小型项目。
然而,随着技术的进步和社区的壮大,越来越多的大型项目也开始采用PureMVC 作为其主要的开发框架。
五、总结PureMVC是一个功能强大且灵活的框架,它为开发者提供了一种简单而有效的方式来构建基于MVC模式的应用程序。
通过分离关注点,PureMVC使得代码更易于理解和维护,同时也提高了应用程序的可扩展性和可重用性。
无论是初学者还是经验丰富的开发者,都可以从PureMVC中受益,提高其开发效率和质量。
基于Flex与PHP的MVC框架整合应用研究发表时间:2010-05-14T13:54:52.390Z 来源:《计算机光盘软件与应用》2010年第4期供稿作者:徐英钟,陈文竹,张凌霄[导读] MVC(模型-视图-控制器)是一种得到了广泛应用的经典复合程序设计模式徐英钟,陈文竹,张凌霄(华中师范大学,武汉 430079)摘要:MVC(模型-视图-控制器)是一种得到了广泛应用的经典复合程序设计模式,使用MVC设计模式能够为软件开发带来低耦合性、高重用性和可适用性、良好的维护性、有利于软件工程化管理等诸多好处,本文探讨了基于PHP的Thinkphp框架和基于Flex的PureMVC框架及其整合应用,对Amfphp和HttpService方式下客户端与服务端的通信效率进行了实验和测试,当通信量较大或者是网络通信环境比较差的时候AMF对通信质量的改善是很有帮助的。
关键词:MVC;PHP;FLEX;框架中图分类号:TP314 文献标识码:A 文章编号:1007-9599 (2010) 04-0000-02MVC F ramework Application&Study Based on Flex&PHPXu Yingzhong,Chen Wenzhu,Zhang Lingxiao(Central China Normal University,Wuhan 430079,China)Abstract:MVC(Model-View-Controller) is a classic,sophisticated and widely used programming design pared with traditional software developm Keywords:MVC;PHP;Flex;FrameworkMVC框架是在开发分工越来越明确的情况下产生的,MVC结构提供了一种按功能对各种对象进行层次分割的方法(这些对象是用来维护和表现数据的),其目的是为了将各对象间的耦合程度减至最小,MVC是程序设计发展的一种趋势。
基于HTML5的SLG游戏开发(三):认识PureMVCpureMVC的Git地址:pureMVC是⼀个轻型的、基于观察者模式设计的MVC框架。
我们⾸先从Git上⾯把pureMVC下载下来,可以看到如下⽬录:pureMVC是开源框架,在src⽬录下,我们可以看到这款框架的源代码。
下⾯,简单说⼀下这个mvc框架:pureMVC框架的⽬标很明确,即把程序分为低耦合的三层:Model、View和Controller。
在PureMVC实现的经典MVC设计模式中,这三部分由三个单例模式类管理,分别是Model、View和Controller,三者合称为核⼼层或核⼼⾓⾊。
PureMVC中还有另外⼀个单例模式类-Facade,Facade提供了与核⼼层(即Model,View和Controller)通信的唯⼀接⼝,以简化开发复杂度。
Model与ProxyModel保存了对Proxy对象的引⽤,Proxy负责操作数据模型,与服务器端进⾏通信存取数据View与MediatorView保存了对Mediator对象的引⽤。
由Mediator对象来操作具体的视图组件(View Component),包括:添加事件监听器,发送或接收Notification,直接改变视图组件(View Component)的状态。
这样做实现了把视图和控制它的逻辑分离开来。
Controller与CommandController保存所有Command的映射。
Command类是⽆状态的,只在需要时才被创建。
Facede与CoreFacade类应⽤单例模式,它负责初始化核⼼层(Model\View\Controller),并能访问他们的Public⽅法。
在实际的应⽤中,你只需要继承Facade类创建⼀个具体的Facade类就可以实现整个MVC模式,并不需要在代码中导⼊编写Model\View\Controller类。
Proxy\Mediator\Command就可以通过创建的Facade类来相互访问通信。
做Flex做久了做大了,就会觉得之前写的的Flex代码开始有点乱,哪怕你写的规范了,但总觉得结构松散,维护不方便,相信很多人刚开始做Flex的时候,都是想到什么功能,就写什么功能,或者有些好点的,就先画了个大体的流程图之类的,因为现在Flex普及得还不够,很多人做Flex也是试探阶段,不敢用作商业项目或其它大项目,只会用来试水技术层面的,所以都是做些小应用的多,就会忽略了设计一个比较好的框架来开发。
所以Flex的开发框架就应运而生了。
目前,好的Flex开发框架还不多,官方有个Cairngorm的框架,可能有些人会说这个框架有点复杂,其实不然,对比起Ruby的Rails,Java的Struts,Spring之类的开发框架,就显得简单得多了。
只要清楚了解要MVC的概念,就会对这些框架并不陌生,但是今天的主角不是Cairngorm,而是另一个Flex框架PureMVC,如果说Cairngorm复杂的话,那么PureMVC就显得简单多了,PureMVC比较轻盈,核心也只有十来个类,是一个轻量级的Flex 框架,但PureMVC的通用性还是比较广的,有PHP的,有Java的有Python的。
可能直接说框架的使用会比较抽象,那么就由一个实例来开始讲解吧,就用一个PureMVC做的一个MP3播放器。
先来看看PureMVC的结构图:在图中,Facade,Model,View,Controller都是PureMVC的四个核心类,都是单例模式的,用户无需操作那Model,View,Controller类,而用户只需要操作Facade就够了,Facade类用来管理其它的三个单例类,顾名思义,那三个类都是分别对应MVC 模式的那三个元素,Facade也是个单例,它负责创建,激活,调用其它的三个类,管理MVC各屋的生命周期。
而我们看看Model类,又细分了一个Proxy类出来,我们称其为代理吧,就是对数据模型的一个代理,负责访问我们的数据对象(Data Object)也就是Cairngorm中的ValueObject,其实都是同一个概念。
PureMVC一、认识PureMVCPureMVC翻译过来就是“纯理论的MVC”,要理解它、发现它的闪光点,必须要先熟悉MVC这个概念。
1.1什么是MVCMVC是Model-View-Cotroller的缩写,Model指数据模型,View指用户界面,Cotroller指控制器。
使用MVC的目的是将M和V分离,从而使同一个程序可以有不同的表现形式。
例如,一批统计数据你可以分别用柱状图、条形图或饼图来表示(这种一个数据对应多个表现形式,又叫做数据的多态呈现)。
C是在的目的则是确保M和V的同步,一旦M改变,V应该同步更新。
MVC是一个设计模式,它强制性的使应用程序的数据、表现和业务逻辑分开。
采用MVC模式设计的应用程序都会被分成三个核心模块:模型、视图和控制器,它们各自处理自己的任务。
1.2 MVC各模块的职责●Model模型表示企业数据和业务规则,负责生成、获取、保存和修改应用程序的数据内容。
例如,它可以是一个数据生成器,也可以是一个操纵数据库的组件。
通常情况下,在MVC的三个模块中,模型拥有最多的处理任务。
被模型返回的数据应当是中立的,就是说模型与数据格式无关,这样一个模型才能为多个视图提供数据。
由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性。
●View视图是用户看到并与之交互的界面,负责捕获用户输入和根据数据进行内容展示。
在Web应用领域,视图主要是指由HTML元素组成的界面,在AS3中,View主要是指继承自DisplayObject类的UI对象。
●Controller控制器接受用户的输入并调用模型和视图去完成用户的需求。
所以当单击Web页面中的超链接和发送HTML表单时,控制器本身不输出任何东西和做任何处理。
它只是接收请求并决定调用哪个模型构件去处理请求,然后用确定用哪个视图来显示模型处理返回的数据。
现在我们总结一下MVC的处理过程,首先控制器接收用户的请求,并决定应该调用哪个模型来进行处理,然后模型用业务逻辑来处理用户的请求并返回数据,最后控制器用相应的视图格式化模型返回的数据,并通过表示层呈现给用户。
(原来的版本字体在浏览器上看太不清楚了,换了个字体)pureMVC简单示例及其原理讲解——开篇pureMVC简单示例及其原理讲解(用户的添加与删除)——开篇pureMVC是一个MVC框架,皆在最大限度的减少MVC间的耦合性。
本人刚刚接触pureMVC时感到一头雾水,不知从何入手,也不知道从何学习。
好在本人有耐性且能看懂英文技术文档,面向对象的编程能力也比较扎实。
在这种背景下,终于悟出了pureMVC的原理,能够使用pureMVC进行开发。
如果把pureMVC的领悟境界分为若干,我是处于最低境界(潜力很大啊)。
好,闲话不说,言归正传。
本示例是在理解了官方示例EmployeeAdmin示例的基础之上的简化版,用意是为了更好的理解pureMVC。
界面:图片上部控件用于添加用户,下部控件用户显示用户信息和删除已添加的用户【图1】首先:pureMVC既然是MVC(Model、View、Controller)框架,那你就必须要记住pureMVC 中的四个主要结构类:∙Proxy(相当于Model)∙Mediator(相当于View)∙Command(相当于Controller)∙Facade(管理Proxy、Mediator和Command的东西)也许上面小括号中的话说的不严谨,在本示例中MVC是这样划分的:1.Model:由VO(Value Object,即值对象)和Proxy组成;2.Mediator:由图1中的两个MXML文件及其对应的Mediator组成;mand:由一个MacroCommand和若干个SimpleCommand组成;4.Facade:即ApplicationFacade;5.启动页:MyPureMVCDemo.mxml文件。
整个示例由以上五个部分组成。
具体如图2所示。
【图2】这里关于3和4要做一下解释。
pureMVC中的Command分为两种:多命令和单一命令,即MacroCommand和SimpleCommand。
pureMVC简单示例及其原理讲解2009-10-10全文显示pureMVC简单示例及其原理讲解——开篇博客分类:•pureMVCMVCFlex框架编程pureMVC简单示例及其原理讲解(用户的添加与删除)——开篇pureMVC是一个MVC框架,皆在最大限度的减少MVC间的耦合性。
本人刚刚接触pureMVC时感到一头雾水,不知从何入手,也不知道从何学习。
好在本人有耐性且能看懂英文技术文档,面向对象的编程能力也比较扎实。
在这种背景下,终于悟出了pureMVC的原理,能够使用pureMVC进行开发。
如果把pureMVC的领悟境界分为若干,我是处于最低境界(潜力很大啊)。
好,闲话不说,言归正传。
本示例是在理解了官方示例EmployeeAdmin示例的基础之上的简化版,用意是为了更好的理解pureMVC。
界面:图片上部控件用于添加 ...•14:35•评论 / 浏览 (1 / 4379)2009-10-10全文显示pureMVC简单示例及其原理讲解——Model层博客分类:•pureMVCMVC数据结构框架pureMVC简单示例及其原理讲解——Model层 pureMVC是一个MVC框架,皆在最大限度保持Model、View、Controller的独立性,从而减少各个层间的耦合。
上一篇《pureMVC简单示例及其原理讲解——开篇》中讲述了本示例宗旨、主要功能文件结构,此外还介绍了pureMVC包含的核心组成。
回顾:本示例的宗旨:本示例是在官方EmployeeAdmin示例上的简化,目的是更简单、更清楚的阐述pureMVC的原理。
主要功能:用户的添加和删除。
文件结构:/upload/picture/pic/46563/4dc24cc ...•14:36•评论 / 浏览 (1 / 4635)•论坛回复 / 浏览 (1 / 1136)2009-10-10全文显示pureMVC简单示例及其原理讲解——View层博客分类:•pureMVCMVCFlashAdobeActionScript编程pureMVC简单示例及其原理讲解——View层 pureMVC是一个MVC框架,目的是为了将Model、View、Controller严格的划分出来。
PureMVC源代码/架构研究puremvc是一个轻量级的mvc开源框架,运用它,可以让你的系统耦合性更低,扩展性更好。
它的代码很简洁,估计不到千行,设计的架构确让人叹为观止。
了解不深,用得不好,开发效率不高,新人的学习曲线很高,代码无法维护。
我最近系统研读它的代码,代码虽然短,却博大精深∙整体架构先来看看puremvc的架构Model保存对Proxy对象的引用,Proxy负责操作数据对象,与远程服务端通信取数据。
View保存对Mediator对象的引用。
Mediator操作具体的视图元件,监听和发送相关的Notification,改变视图组件的状态。
Controller保存所有Command的映射。
Comand是无状态的,需要时被创建,通常比较复杂的业务逻辑都在Command中实现。
Facade是整个框架的核心,它其实是Facade模式,封装了对Model,Controller和View 的操作,简化了相关接口的调用。
∙相关的设计模式Proxy 代理模式–为其他对象如Command、Mediator提供对数据对象的操作Command 命令模式–将请求封装成一个对象,对象的发送者和接受者可以解耦。
这里的Command主要是封装了相关的业务逻辑,可以获得Proxy 和Mediator 的引用进行操作。
Observer 观察者模式–一个监听的对象可以监听相关的事件Notification,当事件发生时,就可以更新相关的操作。
比如Mediator监听相关的Notification,用于改变视图的显示。
Mediator 中介者模式–该模式本意是封装一系列对象的交互,使得各对象不需要显式地互相引用,耦合松散。
puremvc主要用它将视图元件的操作封装起来,所有对视图的操作的都必须通过MediatorFacade 外观模式–定义一个统一的简单的高层接口,使得整个系统更容易使用。
puremve 将Model View 和Controller 的操作都统一管理。
开发框架使用手册目录(目录结构==类文件的文件夹结构)1 patterns包1.1 开发框架1.2 框架结构1.3 使用方法1.4 “高内聚低耦合”的实现——程序架构要点2 Facade类3 mvc包3.1 Model类3.2 View类3.3 Controller类4 media包4.1 Proxy类4.2 Mediator类4.3 Command类4.4 Commands类5 observer包5.1 Observer类5.2 Notifier类5.3 Notice类正文1 patterns包是开发框架的顶级包,应该放在程序的类目录的根目录下。
1.1 开发框架开发框架就是一个空架子,我们可以自己加工、创造零部件,装配上去,使这个系统按照我们的设计意图运行起来。
这个开发框架基于PureMVC框架构建,目标是开发出更健壮、易维护、易扩展、可重用的应用程序。
当然,采用这个开发框架并不等于实现了这个目标,要实现这个目标,还需要我们在开发过程中不断调整、不断优化程序架构。
实现这个目标的关键是,降低模块间的耦合度。
1.2 框架结构这个开发框架分为低耦合的三个层Model、View和Controller。
这三部分由三个单例模式类管理,三者合称为核心层。
还有一个单例模式类——Façade,是整个系统的管理者。
简单地说,就是三个核心层、一个管理者,其余的就是零部件,可以按需增减。
其架构如下图所示:其中:▲ Model负责保存Proxy名称与实例的映射,根据Proxy名称获取其实例。
Proxy负责保存数据对象,存取数据。
▲ View负责保存Mediator名称与实例的映射、Notice名称与观察者的映射,根据Mediator名称获取其实例,根据Notice通知其观察者。
Mediator负责保存视图组件,操作具体的视图组件,处理通知。
观察者负责保存通知的处理者及其处理方法,收到通知则告知其处理者处理这个通知。
core::Controller# commandMap: Array # instance: IController# SINGLETON_MSG: String = "Controller Sin... {readOnly}#view: IView+ Controller() : var+ executeCommand(INotification) : void + getInstance() : IController+ hasCommand(String) : Boolean # initializeController() : void+ registerCommand(String, Class) : void +removeCommand(String) : voidcore::Model# instance: IModel # proxyMap: Array# SINGLETON_MSG: String = "Model Singleto... {readOnly}+ getInstance() : IModel+ hasProxy(String) : Boolean # initializeModel() : void + Model() : var+ registerProxy(IProxy) : void + removeProxy(String) : IProxy +retrieveProxy(String) : IProxycore::View# instance: IView# mediatorMap: Array # observerMap: Array# SINGLETON_MSG: String = "View Singleton... {readOnly}+ getInstance() : IView+ hasMediator(String) : Boolean # initializeView() : void+ notifyObservers(INotification) : void + registerMediator(IMediator) : void+ registerObserver(String, IObserver) : void + removeMediator(String) : IMediator + removeObserver(String, Object) : void + retrieveMediator(String) : IMediator +View() : var«interface»interfaces::ICommand + execute(INotification) : void«interface»interfaces::IController+ executeCommand(INotification) : void + hasCommand(String) : Boolean+ registerCommand(String, Class) : void +removeCommand(String) : void«interface»interfaces::IFacade+ hasCommand(String) : Boolean + hasMediator(String) : Boolean + hasProxy(String) : Boolean+ notifyObservers(INotification) : void + registerCommand(String, Class) : void + registerMediator(IMediator) : void + registerProxy(IProxy) : void + removeCommand(String) : void + removeMediator(String) : IMediator + removeProxy(String) : IProxy+ retrieveMediator(String) : IMediator +retrieveProxy(String) : IProxy«interface»interfaces::IMediator+ getMediatorName() : String + getViewComponent() : Object+ handleNotification(INotification) : void + listNotificationInterests() : Array + onRegister() : void + onRemove() : void+ setViewComponent(Object) : void«interface»interfaces::IModel+ hasProxy(String) : Boolean + registerProxy(IProxy) : void + removeProxy(String) : IProxy +retrieveProxy(String) : IProxy«interface»interfaces::INotification + getBody() : Object + getName() : String + getType() : String+ setBody(Object) : void + setType(String) : void +toString() : String«interface»interfaces::INotifier+ sendNotification(String, Object, String) : void«interface»interfaces::IObserver+ compareNotifyContext(Object) : Boolean + notifyObserver(INotification) : void + setNotifyContext(Object) : void +setNotifyMethod(Function) : void«interface»interfaces::IProxy + getData() : Object+ getProxyName() : String + onRegister() : void + onRemove() : void +setData(Object) : void«interface»interfaces::IView+ hasMediator(String) : Boolean+ notifyObservers(INotification) : void + registerMediator(IMediator) : void+ registerObserver(String, IObserver) : void + removeMediator(String) : IMediator + removeObserver(String, Object) : void +retrieveMediator(String) : IMediator command::MacroCommand # addSubCommand(Class) : void + execute(INotification) : void# initializeMacroCommand() : void +MacroCommand() : varcommand::SimpleCommand + execute(INotification) : voidfacade::Facade# controller: IController # instance: IFacade # model: IModel# SINGLETON_MSG: String = "Facade Singlet... {readOnly}# view: IView+ Facade() : var+ getInstance() : IFacade+ hasCommand(String) : Boolean + hasMediator(String) : Boolean + hasProxy(String) : Boolean # initializeController() : void # initializeFacade() : void # initializeModel() : void # initializeView() : void+ notifyObservers(INotification) : void + registerCommand(String, Class) : void + registerMediator(IMediator) : void + registerProxy(IProxy) : void + removeCommand(String) : void + removeMediator(String) : IMediator + removeProxy(String) : IProxy+ retrieveMediator(String) : IMediator + retrieveProxy(String) : IProxy+sendNotification(String, Object, String) : voidmediator::Mediator# mediatorName: String+ NAME: String = 'Mediator' {readOnly}# viewComponent: Object+ getMediatorName() : String + getViewComponent() : Object+ handleNotification(INotification) : void + listNotificationInterests() : Array + Mediator(String, Object) : var + onRegister() : void + onRemove() : void+ setViewComponent(Object) : voidobserver::Notification+ getBody() : Object + getName() : String + getType() : String+ Notification(String, Object, String) : var + setBody(Object) : void + setType(String) : void +toString() : Stringobserver::Notifier# facade: IFacade = Facade.getInstance()+ sendNotification(String, Object, String) : voidobserver::Observer+ compareNotifyContext(Object) : Boolean + notifyObserver(INotification) : void + Observer(Function, Object) : var + setNotifyContext(Object) : void +setNotifyMethod(Function) : voidproxy::Proxy# data: Object+ NAME: String = 'Proxy'# proxyName: String + getData() : Object+ getProxyName() : String + onRegister() : void + onRemove() : void+ Proxy(String, Object) : var +setData(Object) : void#view#instance#instance#controller#model#view #facade#instance#instance。