刚一个开始看PureMVC,一个字乱,摸不着头脑,不过这个要慢慢的啃,消化,看PureMVC文档要结合它的类图看.
在这里给大家分享一下PureMVC中的观察者模式运用.
观察模式中有主题 ,观察者,通知.在PureMVC中 View充当主题的角色, Observer 当然充当观察者了,Notification 就充当命令通知了.
现在大家都知道PureMVC中观察者模式的角色分别是谁了,这样在去看就非常清晰了,但它的来胧去脉是怎么回事那?
在View中定义了一些方法,主要的方法:
- +registerObserver(in notificationName : String, in observer : IObserver) : void
- +notifyObservers(in notification : INotification) : void
- +registerMediator(in mediator : IMediator) : void
- +retrieveMediator(in mediatorName : String) : IMediator
- +removeMediator(in mediatorName : String) : void
- +hasMediator(in mediatorName : String) : Boolean
+registerObserver(in notificationName : String, in observer : IObserver) : void +notifyObservers(in notification : INotification) : void +registerMediator(in mediator : IMediator) : void +retrieveMediator(in mediatorName : String) : IMediator +removeMediator(in mediatorName : String) : void +hasMediator(in mediatorName : String) : Boolean
这个方法中有两个注册方法,registerObserver这个方法是注册Command的执行方法.在Control中有个registerCommand方法对其进行调用:
- public function executeCommand( note : INotification ) : void
- {
- var commandClassRef : Class = commandMap[ note.getName() ];
- if ( commandClassRef == null ) return ;
- var commandInstance : ICommand = new commandClassRef();
- commandInstance.execute( note );
- }
- public function registerCommand( notificationName : String, commandClassRef : Class ) : void
- {
- if ( commandMap[ notificationName ] == null )
- {
- view.registerObserver( notificationName, new Observer( executeCommand, this ) );
- }
- commandMap[ notificationName ] = commandClassRef;
- }
public function executeCommand( note : INotification ) : void { var commandClassRef : Class = commandMap[ note.getName() ]; if ( commandClassRef == null ) return; var commandInstance : ICommand = new commandClassRef(); commandInstance.execute( note ); } public function registerCommand( notificationName : String, commandClassRef : Class ) : void { if ( commandMap[ notificationName ] == null ) { view.registerObserver( notificationName, new Observer( executeCommand, this ) ); } commandMap[ notificationName ] = commandClassRef; }
registerMediator这个方法是注册视图,以便视图接收通知.
在Mediator中,既可以发送通知,也可以接收通知.
Observer在构造方法,构造两个参数
- public function Observer( notifyMethod:Function, notifyContext:Object )
- {
- setNotifyMethod( notifyMethod );
- setNotifyContext( notifyContext );
- }
public function Observer( notifyMethod:Function, notifyContext:Object ) { setNotifyMethod( notifyMethod ); setNotifyContext( notifyContext ); }
notifyMethod 这个参数是其实是executeCommand方法。
Observer接收到通知后,执行方法:
- public function notifyObserver( notification:INotification ): void
- {
- this .getNotifyMethod().apply( this .getNotifyContext(),[notification]);
-
}
1) 创建 ActionFacade 的实例 _facade , ActionFacade 是 Façade 的实现类,并注册相关的 Command ,如在观察者模式讲到的,把相关的 Command 封装到 Observer 中,并注册到 View 内,其响应的通知名称为“ login ”
override protected function initializeController( ) : void
{
super.initializeController();
registerCommand( STARTUP, StratCommand );
this.registerCommand( LOGIN, LoginCommand );
}
2) 调用 _facade.login(user)
public function login( user:UserVo ):void
{
sendNotification( LOGIN, user );
}
3) 实际上是调用父类 Façade 的 sendNotification 方法
public function sendNotification( notificationName:String, body:Object=null, type:String=null ):void
{
notifyObservers( new Notification( notificationName, body, type ) );
}
而 Façade 方法 notifyObservers
public function notifyObservers ( notification:INotification ):void {
if ( view != null ) view.notifyObservers( notification );
}
也就是说要调用 View 的 notifyObservers 方法
4) View 的 notifyObservers 方法如下,遍历所有关注这个通知(名称)的 Observer ,依次执行这些 Observer 的 notifyObserver 方法。
public function notifyObservers( notification:INotification ) : void
{
if( observerMap[ notification.getName() ] != null ) {
var observers:Array = observerMap[ notification.getName() ] as Array;
for (var i:Number = 0; i < observers.length; i++) {
var observer:IObserver = observers[ i ] as IObserver;
observer.notifyObserver( notification );
}
}
}
5) 下面来看 Observer 的 notifyObserver 方法
public function notifyObserver( notification:INotification ):void
{
this.getNotifyMethod().apply(this.getNotifyContext(),[notification]);
}
这个方法很简单,获取这个 Observer 封装的响应通知的方法(如 exectue ()),并把对应的上下文(如 Controller ),和通知作为参数来执行,呵呵!很像 java 中的反射机制。
6) 如在观察者模式的应用中讲到的,执行了 Controller 的 executeCommand 方法,从而遍历 Command 数组,找到响应这个通知的 Command (如 LoginCommand ),并执行这个 Command 的 exectue 方法。
发表评论
-
AS3 父SWF与子SWF之间传值
2011-02-20 15:19 2617FLASH中 父SWF加载子SWF并向子SWF传值在很多应用上 ... -
flash as3.0 被加载的swf 控制主swf文件触发事件
2011-02-19 14:48 3023比如有两个swf文件 1.swf,2.swf 1.swf ... -
一些很有创意的导航栏设计,给大家分享下。
2011-02-19 11:08 1576希望对各位同学有所帮助。啊哦………… 陆续完善i ... -
浅谈webgame游戏开发技术要点
2011-02-19 11:02 1003写这些只是想和大家交 ... -
aswing
2011-02-19 10:43 857AsWing是一套UI组件框架,纯ActionScript开发 ... -
as3加载外部XML文件
2011-02-18 19:50 1441加载过程如下: 1.使用URLRequ ... -
如何保护swf文件不被反编译软件破解?
2011-02-18 19:42 2172How to protect SWFs from decomp ... -
45度地图编辑器及游戏开发心得
2011-02-15 19:12 1455转载 这个编辑器是本人为公司项目专门开发 的一个功能比较齐 ... -
BulkLoader开源文件加载类
2011-02-09 22:10 1209BulkLoader是一个不错且使用简单的开源加载类, ... -
社区客户端开发技术总结
2011-01-29 22:57 857不管是什么样的项目,都会拆分成一个一个小的模块。最终实现都是些 ... -
“神之惩戒”--国内MMORPG游戏的困局1
2011-01-28 15:13 792《神之惩戒——MMOR ... -
adobe alchemy资料整理
2011-01-28 14:56 2434Adobe 自从2007年中推出了AS3支持 ... -
hitTest(BitmapData.hitTest 方法)
2011-01-25 18:14 1173public hitTest(firstPoint:Poi ... -
AS3使用外部SWF文件的库文件
2011-01-25 15:32 1463在swf文件中使用外部swf文件的库文件,从而达到类似素材 ... -
Flash摄像头游戏课件设计与开发
2011-01-25 11:07 1197[导读] Flash摄像头游戏课件设计与开发 ... -
AS3图像复制BitmapData.copyPixels()
2011-01-22 16:35 1941//舞台属性设置 stage.align ... -
ps样式介绍
2011-01-22 14:32 852PS样式就是效果的集合。“窗口”“样式”就可以打开样式面板。里 ... -
获取当前SWF的绝对路径
2011-01-20 19:22 1374首先 ,说明我测试的系统地址和网络地址的情况: 某电脑 ... -
获取当前SWF的当前路径
2011-01-19 20:00 1441首先 ,说明我测试的系统地址和网络地址的情况: 某电脑 ... -
Event.INIT Event.COMPLETE 区别
2011-01-19 11:50 1280package{ import flash ...
相关推荐
4. **PureMVC模式**:介绍PureMVC的命令模式、观察者模式等设计模式的应用,以及它们如何协同工作以实现松耦合。 5. **实际应用**:提供示例代码和案例,展示如何在实际项目中运用PureMVC,例如创建一个新的模块、...
在PureMVC中,视图通过实现`PureMVC.IView`接口来管理通知观察者(Observer)列表,接收并分发通知。 3. **控制器(Controller)**:控制器处理视图发出的命令,并协调模型和视图之间的交互。在登录实例中,可能会...
PureMVC框架引入了命令模式、观察者模式和代理模式等设计模式,使得MVC模式在实际应用中更加灵活和强大: 1. **命令模式**:将操作封装为命令对象,便于管理和复用。当收到事件通知时,调度中心会根据事件类型执行...
7. **通知(Notification)**:PureMVC使用观察者模式来传递消息。Notification对象作为消息载体,包含了消息的类型和数据,可以跨模块传递,使得不同组件之间能进行非侵入式的通信。 文档《puremvc_implementation...
4. **通知(Notifications)**:PureMVC中的通信机制是基于观察者模式的Notification。任何对象都可以发布、订阅和广播Notification。这种设计允许组件之间松散耦合,增强了系统的可扩展性和可维护性。 5. **结构...
PureMVC是一种基于观察者模式的框架,它将应用分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种分层设计有助于提高代码的可复用性、可维护性和模块化。 - **模型(Model)**:负责存储...
通常,PureMVC的示例会涵盖命令模式、观察者模式等设计模式的运用,以及如何实现模块化和解耦。 【标签】"源码"和"工具"提示我们,这篇文章可能不仅提供了理论解释,还可能包含实际的源代码示例,以便读者可以直接...
PureMVC通过命令、观察者、代理、门面等模式进一步细化了这些职责。 1. **PureMVC的组件** - **Model**: 模型层由Proxy类组成,它们负责存储和管理应用程序的数据。 - **View**: 视图层由Mediator类构成,它们...
JavaScript PureMVC库文件是基于JavaScript编程语言实现的PureMVC框架的核心组件集合。...无论你是新手还是经验丰富的开发者,理解并熟练运用PureMVC框架,都将对你的JavaScript项目带来显著的益处。
PureMVC是基于观察者模式的框架,它将应用程序分为三个主要部分:模型(Model)、视图(View)和控制器(Controller)。这种架构设计有助于提高代码的可维护性和可扩展性,使得开发者可以专注于业务逻辑,而不用...
2. **事件驱动**:PureMVC使用观察者模式,使得游戏状态的变化能够通过事件通知到相关的组件,保证了各个部分的同步更新。 3. **命令模式**:PureMVC中的命令模式使得游戏逻辑的处理更为清晰,开发者可以通过定义...
PureMVC for Java同样遵循MVC模式,提供了命令、观察者、代理、实体和宏命令等核心组件,以帮助开发者构建可复用、可扩展的Java应用。通过与Java的集成,我们可以利用Java的强大功能,如多线程、网络通信和数据库...
2. **观察者模式**:通过通知(Notification)类实现事件驱动,使得组件间可以解耦通信。 3. **多例模式**:提供单例(Singleton)和多例(Multiton)两种模式的Proxy和Mediator,适应不同场景需求。 4. **宏命令**...
在PureMVC中,模型由Proxy类来实现,它们存储和处理数据,并提供观察者模式,使得其他组件可以监听数据变化。 2. **View(视图)**: 视图层负责展示数据和处理用户交互。PureMVC中的View由Mediator和Observer模式...
文档中可能会涵盖如观察者模式、命令模式、代理模式等设计模式的使用,以及在PureMVC中如何实施这些模式来提高代码的可维护性和复用性。同时,这份文档可能还会提供在实际开发中如何避免常见问题、优化性能的建议。 ...
**纯MVC(PureMVC)框架五子棋代码详解** PureMVC是一个轻量级的框架,它遵循模型-视图-控制器(MVC)设计模式,旨在提高软件的可维护性和...通过分析和实践,你可以更好地掌握MVC设计模式以及PureMVC框架的运用技巧。
在PureMVC中,视图主要由Notification和Observer实现,Notification是事件通知机制,Observer是观察者模式的实现,用于视图和模型之间的通信。 3. 控制器(Controller):控制器层处理用户输入并协调模型和视图的...
在Flex Pure MVC中,模型组件通过注册为“观察者”来监听其他层的事件,确保数据的一致性。 - 注册模型代理(Proxy)用于处理与服务器的数据交换,可以实现数据的加载、存储和转换。 - 注册实体(Mediator)则用于...
- 它通过模块化、命令模式、观察者模式等设计模式,为开发者提供了一套规范的开发框架,使代码结构更加清晰,易于维护。 2. **核心组件**: - **Model(模型)**:负责数据的存储和管理,与业务逻辑层交互,不...
2. 观察者模式:通过Observer接口,实现Model和View之间的双向通信,确保数据更新时视图能实时响应。 3. 多态性:通过接口和抽象类,PureMVC提供了一套可扩展的架构,开发者可以方便地自定义Model、View和...