`
lijj_72
  • 浏览: 22463 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

PureMVC软件架构分析与鉴赏

阅读更多

PureMVC软件架构分析与鉴赏

        李俊杰

概述

随着客户端程序的风起云涌,Adobe公司收购了Macromedia公司,针对Flesh的客户端进行研发,推出了Flex语言。Flex语言是类似与java的面向对象语言,编码格式又吸收了Delphi的编码风格,尽管Flex可以展现Flesh的炫目的客户端效果,全新的用户体验,但针对企业化的应用,仅有Flex是远远不够的,需要有合理的软件架构规范,于是Flex世界的MVC框架就应运而生了,PureMVCFlex世界中的MVC模式的具体实现,相对于adobe官方的CairngormFlex MVC框架,PureMVC更加简单实用。

PureMVC的整体架构

从使用者角度上讲,PureMVC设计的非常合理,对外的接口是Façade,由Façade来组织整个应用,其命名规范也显而易见,可以望文生义。其中ControllerModelView是管理ICommandIProxyIMediator的容器,而ICommandIProxyIMediato是应用系统要扩展的MVC各层的接口。

这样,使用者就可以方便地扩展FaçadeCommandProxyMediator,来完成MVC各层的功能,没有特殊的需要,一般无需关注ModelViewController核心代码。

<v:shapetype o:spt="75" coordsize="21600,21600" filled="f" stroked="f" id="_x0000_t75" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:extrusionok="f" o:connecttype="rect" gradientshapeok="t"></v:path><o:lock v:ext="edit" aspectratio="t"></o:lock></v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" o:ole="" style="WIDTH: 344.25pt; HEIGHT: 252.75pt"><v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image001.emz" o:title=""></v:imagedata></v:shape>

PureMVC的分层设计理念

PureMVC的各个层次各负其责,Façade实现统一管理,定义了系统的统一接口,使用者无需了解底层代码的运作方式。 Model层是实现与后台交互的层次,由Model类来管理Proxy,当然在Flex中也支持直接访问数据库,但大多数业务系统中,都是Flex作为客户端程序,而后台由Java或者.net来完成真正的业务操作。View层是显示层,在PureMVC中由Mediator实现对Viewcomponent的操作,如界面的简单校验等功能。Controller层是控制层,主要来处理一些数据转换等工作。下面具体介绍各层的具体功能及设计

Façade,外部应用的接口界面

从下图可以看出,Façade是对外的接口,同时管理ModelView, Controller,同时Façadesingleton

1)在Java中实现singleton模式,构造方法都使用private方法,而这儿使用了public,但看第一句代码,呵呵!效果是一样的。但最好不要直接调用这个public方法

public function Facade( ) {

                     if (instance != null) throw Error(SINGLETON_MSG);

                     instance = this;

                     initializeFacade();   

              }

2)模板模式的应用

protected function initializeFacade(  ):void {

                     initializeModel();

                     initializeController();

                     initializeView();

              }

Façade的构造方法中使用了模板模式,虽然Façade本身也实现了这些初始化方法,但都是获得ModelControllerView,在具体应用中就可以initializeController()这三个方法,来注册相关的ProxyCommandMediator等。注意,实际上override initializeController()方法是比较常见的,而不常override initializeModel()initializeView() 最常见的是在Commandexecute()中创建并注册Proxy,或者创建并注册Mediator

3)如下的IFacade接口中,其中的ProxyCommandMediator管理方法都是借助于ModelControllerView的管理方法来实现的。

4Façade是实现INotifier接口的,所以Façade可以向系统发出消息或者通知,因为Flex是客户端的程序语言,其调用方式也是类似与Windows方式的观察者(observer)模式,Façade是统一的接口界面,所以几乎所有的外部调用都是通过sendNotification()方法。这个方法的调用的是notifyObservers()方法,而这个方法是如下的:

public function notifyObservers ( notification:INotification ):void {

                     if ( view != null ) view.notifyObservers( notification );

              }

通常你只需要调用sendNotification()。

<v:shape id="_x0000_i1026" type="#_x0000_t75" o:ole="" style="WIDTH: 415.5pt; HEIGHT: 272.25pt"><v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image003.emz" o:title=""></v:imagedata></v:shape>

下面具体介绍PureMVCMVC各层的架构设计:

Model Proxy

1)如上所述,Model也是Singleton设计模式,也无需使用new的方式创建,另外在企业应用中也很少直接扩展这个类,如果需要扩展,可以扩展initializeModel(),就相当于对Model的扩展了。

public function Model( )

              {

                     if (instance != null) throw Error(SINGLETON_MSG);

                     instance = this;

                     proxyMap = new Array();    

                     initializeModel();    

              }

2Model是管理Proxy的容器类,使用类似与Java中的HashMap的数据类Array,来管理Proxy,代码类似:

protected var proxyMap : Array;

proxyMap[ proxy.getProxyName() ] = proxy;

包括后面谈到的ControllerView,都是这样管理其对象的,如获取某个值对象,

return proxyMap[ proxyName ];//简单吧,呵呵!

3)在registerProxy()和removeProxy()方法中,分别调用了ProxyonRegister()onRemove()方法,看到这儿,你是不是感到很熟悉。onXxxx()的命名规则,表示由子类实现详细内容来override父类的内容。抽象的原则是:共性化的东西向上(父类)抽象,个性化的东西向下(子类)延伸。即在实际应用中ProxyonRegister()onRemove()这两个方法是用来扩展我们自己的功能代码的。

Model

public function registerProxy( proxy:IProxy ) : void

            {

                   proxyMap[ proxy.getProxyName() ] = proxy;

                   proxy.onRegister();

            }

Proxy

public function onRegister( ):void {}

<v:shape id="_x0000_i1027" type="#_x0000_t75" o:ole="" style="WIDTH: 3in; HEIGHT: 229.5pt"><v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image005.emz" o:title=""></v:imagedata></v:shape>

4Proxy是我们要扩展的类,可以看出Proxy类实现了数据的交互,setData()和getData()方法实现数据的装载和获取,onRegister( )onRemove( )可以实现相关Proxy注册和注销时的功能。

5proxyName,是唯一表示系统中这个Proxy的名称,如上所述,Model管理Proxy是依赖类似与JavaHashMapArray,所以必须是key->value(名值对),类似这样的设计还包括MediatorCommandFaçade等。

6Proxy还实现了INotifier接口,所以也可以向外发送通知(消息),后面会具体讲解观察者模式在Flex中的广泛应用。

7Proxy继承了Notifier类,在Notifier类中有Protected属性façade,这个Façade是系统中单例,所以可以通过这个Façade来注册相关的Mediator

<v:shape id="_x0000_i1028" type="#_x0000_t75" o:ole="" style="WIDTH: 252pt; HEIGHT: 192pt"><v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image007.emz" o:title=""></v:imagedata></v:shape>

View Mediator

1)类似于Model View是管理Mediator的容器类,但View除了管理Mediator以外,还管理Observer,后面会专门讲Observer,其他如MediatorCommandProxyFaçadeObserver的注册都最终到View中来管理。

2View作为管理MediatorObserver的容器,利用的就是FlexArray对象,Array对象如上面所说的JavaHashMap,也类似与Java中的Stack,其有push(), pop()等方法,

public function registerObserver ( notificationName:String, observer:IObserver ) : void

              {

                     var observers:Array = observerMap[ notificationName ];

                     if( observers ) {

                            observers.push( observer );

                     } else {

                            observerMap[ notificationName ] = [ observer ];

                     }

              }

这儿使用了push()方法,可以看出和Java HashMap的差异,HashMapkey/value,而Flex Array中一个key,可以对应多个Value,事实上是一个通知(消息),对应多个观察者(1..n)。

<v:shape id="_x0000_i1029" type="#_x0000_t75" o:ole="" style="WIDTH: 308.25pt; HEIGHT: 280.5pt"><v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image009.emz" o:title=""></v:imagedata></v:shape>

3Mediator作为应用中要扩展的对象,被View容器管理,根据FlexArray特性,每个Mediator必须有唯一的名称mediatorName,作为key,保存在Array中,同样Mediator也是继承了Notifier类,这样拥有Façade protected属性,可以注册相关Command<

分享到:
评论

相关推荐

    PureMVC C++架构代码

    8. **Facade(门面)**:门面是整个PureMVC架构的入口点,提供了一个简单的接口,用于初始化和访问系统中的所有其他组件。通过门面,开发者可以轻松地管理和协调应用程序的各个部分。 在压缩包文件`PureMVC_CPP_1_0...

    pureMVC架构详细讲解

    6. **Larena2.0与3.0APP框架差异——pureMVC架构的解析与仿制.ppt**:这个文件可能详细分析了Larena应用程序框架在2.0和3.0版本中如何采用PureMVC架构,并可能讨论了它们之间的差异和改进之处。 7. **pureMVC类成员...

    PureMVC 中文版

    描述 "Flex framework,又一个新的flex界面框架" 暗示PureMVC 是与Adobe Flex相关的,Flex是用于创建交互式、高性能的RIA的开发工具包,它使用MXML和ActionScript进行开发。而PureMVC作为一个框架,为Flex应用程序...

    puremvc源码分析

    通过分析源码,我们可以看到PureMVC是如何优雅地实现MVC模式,以及如何通过命令模式和观察者模式来增强其灵活性和可扩展性。理解这些核心概念和机制,对于在实际项目中使用PureMVC框架进行开发至关重要。

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

    PureMVC是一种经典的多层应用架构模式,它为ActionScript、JavaScript、Swift等语言提供了一个可复用的框架,用于构建松耦合、模块化的应用程序。 PureMVC的核心概念包括三个主要角色:模型(Model)、视图(View)...

    Lua实现PureMVC

    这个是一个根据AS3(ActionScript 3) pureMVC而转换过来的lua pureMVC。所有的接口完全跟AS3版本一致。 若是想使用,可以直接查看网上的pureMVC 文档,我并未对任何一个函数改名或者更换参数位置。 注意,这个PureMVC...

    PureMVC架构图

    **PureMVC架构图** PureMVC是一种轻量级的、模型-视图-控制器(MVC)设计模式实现,特别适用于Flash、Flex以及ActionScript等技术栈。它旨在提供一种标准的、可复用的架构,使得开发人员能够更好地组织代码,提高...

    PureMVC五子棋游戏源码,学习PureMVC

    《深入理解PureMVC:基于五子棋游戏...通过分析这个五子棋游戏源码,我们可以深入理解PureMVC的MVC模式如何应用于实际项目,从而提升我们的软件设计和开发能力。无论是初学者还是经验丰富的开发者,都能从中受益匪浅。

    PureMVC总结(附Hello World含PureMVC源码代码和文档)

    4. **模块化设计**:PureMVC支持多模块架构,如何创建和管理多个独立的MVC子系统。 5. **应用场景与最佳实践**:PureMVC在实际项目中的使用场景,以及如何优化和扩展框架。 6. **Hello World示例**:通常会通过一...

    PureMVC_CSharp.zip_csharp_pureMVC_pureMVC C_pureMVC C#_疯铮铮

    PureMVC是一个开源的、轻量级的框架,主要用于构建多层应用架构,它遵循了经典的Model-View-Controller(MVC)设计模式。在C#版本中,PureMVC为开发者提供了一种规范化的、可扩展的方式来组织代码,使得项目更易于...

    puremvc开发框架详解

    **Core**:Core层包含了Model、View和Controller三个核心组件,它们构成了PureMVC架构的基础。通过这些组件的协作,PureMVC能够实现低耦合的设计。 #### 三、通知机制(Notification) 在PureMVC中,Notification...

    PureMVC C#框架

    6. **纯MVC架构**:PureMVC强调的是MVC模式的纯粹实施,每个组件都有明确的职责,使得代码结构清晰,易于理解和维护。这种架构对于大型项目尤其有益,因为它有助于保持代码的模块化和低耦合。 7. **模块化设计**:...

    pureMVC_AS3

    MVC模式是软件工程中的一种架构模式,将应用程序分为三个核心部分:模型(Model)、视图(View)和控制器(Controller)。在PureMVC中,这三者都由特定的类来实现: 1. **模型(Model)**:负责处理应用程序的数据...

    PureMVC中文教程

    2. **PureMVC架构**:详细介绍PureMVC的四个核心组成部分:Model(模型)、View(视图)、Controller(控制器)以及MacroCommand、Mediator、Proxy、Notification等核心类的角色和职责。 3. **核心组件**:深入解析...

    PureMvc实例 PureMvc第一个实例

    首先,让我们深入了解一下PureMvc的MVC架构: 1. **模型(Model)**:在PureMvc中,模型层负责处理应用程序的数据和业务逻辑。它由一系列`Proxy`类组成,这些类封装了与数据源的交互,可以是本地存储或远程服务。`...

    PureMVC.rar

    首先,我们来深入理解PureMVC的核心概念和架构: 1. **模型(Model)**:模型层负责应用程序的数据管理。在PureMVC中,模型由`Proxy`类表示,它们存储和处理数据,同时提供对数据的访问接口。当数据发生变化时,...

    pureMVC源代码

    6. **Facade**:`Facade`是整个PureMVC架构的门面,它提供了一种简单的方式来与框架的其他部分交互,减少了组件间的耦合。 在`PureMvcDemo`中,你可以看到如何将这些组件组合在一起,创建一个简单的应用。这个示例...

    Unity 专用 pureMVC

    PureMVC是面向对象的多层应用程序框架,它提供了一种模式来组织代码,使开发更加规范和高效。本篇文章将深入探讨Unity中如何使用PureMVC框架,以及它如何帮助实现UI和逻辑的分离。 PureMVC是一个轻量级的框架,其...

    PureMVC的例子

    5. **PureMVC与BlazeDS的结合**:理解如何在PureMVC的架构中使用BlazeDS进行数据交互,如通过Proxy处理远程调用,或者通过Command处理复杂的业务逻辑。 6. **项目结构**:分析“WEB-INF”和“META-INF”目录下的...

    qt版本pureMVC

    PureMVC是一个轻量级的、跨平台的、多线程的框架,它遵循MVC设计模式,用于简化应用的架构。MVC模式将应用程序分为三个主要部分:模型(Model)、视图(View)和控制器(Controller),各自负责处理数据、显示用户...

Global site tag (gtag.js) - Google Analytics