`
steely816
  • 浏览: 129401 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

PureMVC中观察者模式运用

 
阅读更多

刚一个开始看PureMVC,一个字乱,摸不着头脑,不过这个要慢慢的啃,消化,看PureMVC文档要结合它的类图看.
在这里给大家分享一下PureMVC中的观察者模式运用.
观察模式中有主题 ,观察者,通知.在PureMVC中 View充当主题的角色, Observer 当然充当观察者了,Notification 就充当命令通知了.
现在大家都知道PureMVC中观察者模式的角色分别是谁了,这样在去看就非常清晰了,但它的来胧去脉是怎么回事那?
在View中定义了一些方法,主要的方法:

Java代码
  1. +registerObserver(in notificationName : String, in observer : IObserver) : void   
  2. +notifyObservers(in notification : INotification) : void   
  3. +registerMediator(in mediator : IMediator) : void   
  4. +retrieveMediator(in mediatorName : String) : IMediator   
  5. +removeMediator(in mediatorName : String) : void   
  6. +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方法对其进行调用:

Java代码
  1. public function executeCommand( note : INotification ) : void   
  2. {   
  3.    var commandClassRef : Class = commandMap[ note.getName() ];   
  4.    if ( commandClassRef == null ) return ;   
  5.       var commandInstance : ICommand = new commandClassRef();   
  6.      commandInstance.execute( note );   
  7.    }   
  8.   
  9. public function registerCommand( notificationName : String, commandClassRef : Class ) : void   
  10. {   
  11.    if ( commandMap[ notificationName ] == null )   
  12.    {   
  13.      view.registerObserver( notificationName, new Observer( executeCommand, this ) );   
  14.      }   
  15.      commandMap[ notificationName ] = commandClassRef;   
  16.     }  
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在构造方法,构造两个参数

Java代码
  1. public function Observer( notifyMethod:Function, notifyContext:Object )   
  2. {   
  3.    setNotifyMethod( notifyMethod );   
  4.    setNotifyContext( notifyContext );   
  5. }  
public function Observer( notifyMethod:Function, notifyContext:Object ) 
 {
   setNotifyMethod( notifyMethod );
   setNotifyContext( notifyContext );
 }


notifyMethod 这个参数是其实是executeCommand方法。
Observer接收到通知后,执行方法:

Java代码
  1. public function notifyObserver( notification:INotification ): void   
  2. {   
  3. 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 方法。

分享到:
评论

相关推荐

    PureMVC中文教程

    4. **PureMVC模式**:介绍PureMVC的命令模式、观察者模式等设计模式的应用,以及它们如何协同工作以实现松耦合。 5. **实际应用**:提供示例代码和案例,展示如何在实际项目中运用PureMVC,例如创建一个新的模块、...

    可以运行的puremvc的登陆实例.

    在PureMVC中,视图通过实现`PureMVC.IView`接口来管理通知观察者(Observer)列表,接收并分发通知。 3. **控制器(Controller)**:控制器处理视图发出的命令,并协调模型和视图之间的交互。在登录实例中,可能会...

    基于PureMVC框架实现的Qt的一个例子

    PureMVC框架引入了命令模式、观察者模式和代理模式等设计模式,使得MVC模式在实际应用中更加灵活和强大: 1. **命令模式**:将操作封装为命令对象,便于管理和复用。当收到事件通知时,调度中心会根据事件类型执行...

    PureMVC结构pdf中文版

    7. **通知(Notification)**:PureMVC使用观察者模式来传递消息。Notification对象作为消息载体,包含了消息的类型和数据,可以跨模块传递,使得不同组件之间能进行非侵入式的通信。 文档《puremvc_implementation...

    pureMVC架构详细讲解

    4. **通知(Notifications)**:PureMVC中的通信机制是基于观察者模式的Notification。任何对象都可以发布、订阅和广播Notification。这种设计允许组件之间松散耦合,增强了系统的可扩展性和可维护性。 5. **结构...

    pureMVC Demo C#

    PureMVC是一种基于观察者模式的框架,它将应用分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种分层设计有助于提高代码的可复用性、可维护性和模块化。 - **模型(Model)**:负责存储...

    [转]pureMVC简单示例及其原理讲解

    通常,PureMVC的示例会涵盖命令模式、观察者模式等设计模式的运用,以及如何实现模块化和解耦。 【标签】"源码"和"工具"提示我们,这篇文章可能不仅提供了理论解释,还可能包含实际的源代码示例,以便读者可以直接...

    [转] PureMVC心得教程:使用puremvc框架实现的贪吃蛇

    PureMVC通过命令、观察者、代理、门面等模式进一步细化了这些职责。 1. **PureMVC的组件** - **Model**: 模型层由Proxy类组成,它们负责存储和管理应用程序的数据。 - **View**: 视图层由Mediator类构成,它们...

    javascript PureMVC库文件

    JavaScript PureMVC库文件是基于JavaScript编程语言实现的PureMVC框架的核心组件集合。...无论你是新手还是经验丰富的开发者,理解并熟练运用PureMVC框架,都将对你的JavaScript项目带来显著的益处。

    puremvc-js-multicore-framework-master

    PureMVC是基于观察者模式的框架,它将应用程序分为三个主要部分:模型(Model)、视图(View)和控制器(Controller)。这种架构设计有助于提高代码的可维护性和可扩展性,使得开发者可以专注于业务逻辑,而不用...

    flash actionscript3游戏编程之AS3 PureMVC设计模式在AS中的应用例子_详解MVC的作用.zip

    2. **事件驱动**:PureMVC使用观察者模式,使得游戏状态的变化能够通过事件通知到相关的组件,保证了各个部分的同步更新。 3. **命令模式**:PureMVC中的命令模式使得游戏逻辑的处理更为清晰,开发者可以通过定义...

    pureMVC精典实例

    PureMVC for Java同样遵循MVC模式,提供了命令、观察者、代理、实体和宏命令等核心组件,以帮助开发者构建可复用、可扩展的Java应用。通过与Java的集成,我们可以利用Java的强大功能,如多线程、网络通信和数据库...

    PureMVC_dep_JS

    2. **观察者模式**:通过通知(Notification)类实现事件驱动,使得组件间可以解耦通信。 3. **多例模式**:提供单例(Singleton)和多例(Multiton)两种模式的Proxy和Mediator,适应不同场景需求。 4. **宏命令**...

    PureMVC框架源码

    在PureMVC中,模型由Proxy类来实现,它们存储和处理数据,并提供观察者模式,使得其他组件可以监听数据变化。 2. **View(视图)**: 视图层负责展示数据和处理用户交互。PureMVC中的View由Mediator和Observer模式...

    pureMVC Flex

    文档中可能会涵盖如观察者模式、命令模式、代理模式等设计模式的使用,以及在PureMVC中如何实施这些模式来提高代码的可维护性和复用性。同时,这份文档可能还会提供在实际开发中如何避免常见问题、优化性能的建议。 ...

    puremvc 五子棋 代码

    **纯MVC(PureMVC)框架五子棋代码详解** PureMVC是一个轻量级的框架,它遵循模型-视图-控制器(MVC)设计模式,旨在提高软件的可维护性和...通过分析和实践,你可以更好地掌握MVC设计模式以及PureMVC框架的运用技巧。

    pureMVC 教程

    在PureMVC中,视图主要由Notification和Observer实现,Notification是事件通知机制,Observer是观察者模式的实现,用于视图和模型之间的通信。 3. 控制器(Controller):控制器层处理用户输入并协调模型和视图的...

    flex pure mvc框架

    在Flex Pure MVC中,模型组件通过注册为“观察者”来监听其他层的事件,确保数据的一致性。 - 注册模型代理(Proxy)用于处理与服务器的数据交换,可以实现数据的加载、存储和转换。 - 注册实体(Mediator)则用于...

    PureMVC for as3 SWC帮助文件

    - 它通过模块化、命令模式、观察者模式等设计模式,为开发者提供了一套规范的开发框架,使代码结构更加清晰,易于维护。 2. **核心组件**: - **Model(模型)**:负责数据的存储和管理,与业务逻辑层交互,不...

    puremvc-lua-framework:Puremvc 框架,由 Lua 工作

    2. 观察者模式:通过Observer接口,实现Model和View之间的双向通信,确保数据更新时视图能实时响应。 3. 多态性:通过接口和抽象类,PureMVC提供了一套可扩展的架构,开发者可以方便地自定义Model、View和...

Global site tag (gtag.js) - Google Analytics