当前位置: 首页 > 编程日记 > 正文

记录第一次在egret项目中使用Puremvc

这几天跟着另一个前端在做一个小游戏,使用的是egret引擎和puremvc框架,这对于我来说还是个比较大的突破吧,特此记录下。

因为在此项目中真是的用到了mvc及面向对象编程,值得学习


记录第一次在egret项目中使用Puremvc:

主开发说他在使用puremvc框架时对puremvc框架的使用进行了一些改良

程序中整个puremvc框架的使用思路:

1. View层自己来操作自己,Mediator用来接收和处理通知,在整个框架中任何地方都可以发布全局通知(通过facade单例的 sendNotification 方法),Model只关心数据,即Model层只与程序中所需要的数据层来打交道

具体使用:

1.在egret项目中引入puremvc框架,具体引入方法

Puremvc对应typescript版本的下载地址:puremvc-typescript-standard-framework点击下载,

Egret项目中如需引入puremvc将bin文件夹内三个文件复制到项目中,具体构建第三方库方法可看下官方文档,

2.新建facade单例,具体代码如下:

class AppFacade extends puremvc.Facade implements puremvc.IFacade {public constructor() {super();}public static STARTUP: string = "startup";//提供静态函数,供外界调用 
    public static getInstance(): AppFacade {if(puremvc.Facade.instance == null){puremvc.Facade.instance = new AppFacade();}return <AppFacade><any>(puremvc.Facade.instance);}//该函数 是 该类的初始化函数,创建改类实例后会自动调用改函数  //注册控制器  public initializeController(): void {super.initializeController();RegisterCommond.Register();}//注册数据模型  public initializeModel():void{super.initializeModel();RegisterModel.init();}//注册View视图public initializeView():void{super.initializeView();RegisterView.Register();}public initializeFacade():void{super.initializeFacade();}}

Facade的类是PureMVC的核心类,负责管理调度PureMVC中的成员交互和运作。一般来说,一个应用中创建一个facade对象就够了。PureMVC中主要有三个角色:Mediator、Command以及Proxy。这三个角色分别对应着我们通常所说的MVC思想中的V(视图)、C(控制器)、M(数据管理器)。它们只有被注册到facade类中才能运作,才有意义。通过调用facade对象的registerMediator、registerCommand或registerProxy方 法可以将它们注册到facade对象中去。一旦被注册到facade对象中去了之后,享用同一注册源的Mediator、Command以及Proxy对 象就可以通过notification(通知)进行彼此之间的通讯,而事件只有事件派发者本人或其显示列表的父容器才能侦听到。使用notification进行通讯是PureMVC最大的便利之处。在一个Mediator、Command或者Proxy对象中使用sendNotification方法可以派发一个notification通知:

sendNotification("MyNotification");

该 方法的首个参数代表该条notification的名字,确保notification的名字的唯一性是减少意外错误的最佳保证。如果你愿意,你可以为该 方法传入第二个参数作为该条notification所携带的数据,可以是一个String, int或者是Object、Array等复杂对象。

3.注册Mediator

class BaseMediator extends puremvc.Mediator{public autoClose:Boolean=false;private _panelCls:any;public body:SkinCell;public constructor(mediatorName) {super(mediatorName);}public onRegister(): void {}public initPanel(): void {}public get listcloseNotification(): string[]{return [];}public get listopenNotification(): string[] {return [];}public listNotificationInterests():string[]{return [];}public isOpenNotification(name:string):boolean{return this.listopenNotification.indexOf(name) != -1;}public isCloseNotification(name: string): boolean{return this.listcloseNotification.indexOf(name) != -1;}public hasOpen(notification: puremvc.INotification = null): boolean{return true;}public hasClose(notification: puremvc.INotification = null): boolean{return true;}public createUI(notification:puremvc.INotification = null):void{}public addBody(): void {if(this.body && !this.body.parent) {GameLayerManager.gameLayer().sceneLayer.addChild(this.body);}}public openPanel(notification:puremvc.INotification = null):void{this.createUI(notification);this.addBody();}public closePanel(notification: puremvc.INotification = null): void {this.removeBody();this.closeMediator(notification);}public removeBody():void{if(this.body) {this.body.cleanUp();this.body=null;}}public handleNotification(notification: puremvc.INotification):void{}public closeMediator(notification):void{if(this.facade.hasMediator(this.mediatorName)) {this.facade.removeMediator(this.mediatorName);}}public resizeHandler():void{if(this.body){this.body.resizeHandler(); }}
}

及Mediator接收处理通知

public handleNotification(notification:puremvc.INotification): void {var name = notification.getName();switch(name){case StoryMNotify.addNpcdialog: (this.body as NpcDialogUI).addDialogView(notification.getBody());console.trace();break;case StoryMNotify.clearNpcdialog:(this.body as NpcDialogUI).clearDialogs();break;case GameNotify.canvasResizeHandler: this.resizeHandler();break;}}

PureMvc介绍

参考文章:

http://www.cnblogs.com/ribavnu/p/3874748.html

http://blog.csdn.net/dily3825002/article/details/7333514

http://blog.csdn.net/lyh916/article/details/50058207


首先来一张puremvc的经典架构图,起初看起来很复杂,后来才知道其实它只是比一般的mvc框架在架构上多了一个facade实例

Pure MVC 初识

pureMVC框架的目标很明确,即把程序分为低耦合的三层Model、View和Controller,这三部分有三个单例模式类管理,分别是Model、veiw和controller。三者是核心层或说核心角色。
pureMVC中还有一个单例模式类——Facade,Facade提供了与核心层通信的唯一接口,以简化开发程度。它负责初始化核心层,并访问他们的Public方法。Facade是三者的经纪人。该类可以当成抽象类,永远不要被实例化,针对具体程序编写Facade的子类,添加或重写Facade的方法来实现具体应用。

pureMVC的通信是使用观察者模式以一种松耦合方式实现的。

Model保存对Proxy对象的引用,Proxy负责操作数据模型,与远程服务通信存取数据。

View保存对Mediator对象的引用,由Mediator对象来操作具体的视图组件。

Controller保存所有Command的映射,Command类是无状态的,只有在需要时创建。

Model保存了对Proxy对象的引用,Proxy负责操作数据模型(调用Json接收相应面板的Mediator中发送的Notification,连接后台接收数据存入相应Vo),与远程服务通信存取数据。model里面一般放着一个view向对应的Proxy和Vo。View保存对Mediator对象的引用。用Mediator对象操作具体的视图组件,包括:显示视图添加事件监听,发送或接收Notification,直接改变组件的状态。

Controller保存所有Command的映射。command类是无状态的,只在需要时创建。

Command可以获取proxy对象并与之交互,发送Notification,执行其他的command经常用于复杂的或系统范围操作,如应用程序的启动和关闭,应用程序业务逻辑应该在这里实现。

Facade类应用了单例模式,负责初始化核心层,并能访问它们的Public方法。

Proxy、Mediator和Command可以通过创建的Facade类来相互访问通信。

PureMvc通信不采用falsh的Event/EvenDispatch,它是使用观察者模式以以一种松耦合的方式来实现。

当View注册了Mediator时,Mediator的listNotifitions的方法会被调用,以数组的形式返回Mediator对象所关心的所有Notification。

proxy发送但不接收Notification

Proxy从远程服务器接收到数据,发送Notification告诉系统,或当Proxy数据被更新时发送Notification告诉系统。

Facade类应被看做抽象类,永远不要被直接实例化。针对具体应用程序编写具体Facade的子类,添加或重写Facade的方法来实现具体应用。

转载于:https://www.cnblogs.com/fighxp/p/7778385.html

相关文章:

使用CSS制作圆角效果

Web2.0中&#xff0c;圆角效果是很常见的&#xff0c;以前都是用图片来模仿&#xff0c;现在直接用css就能实现&#xff0c;例子代码如下 Html代码&#xff1a; <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> &…

知识图谱升温之势已现,不要错失下一个AI风口

近年来&#xff0c;随着大家对高级认知能力的积极探索&#xff0c;知识图谱因为表达能力强&#xff0c;扩展性好&#xff0c;并能兼顾人类认知与机器自动处理&#xff0c;引起了学术界、工业界以及政府部门的高度关注。 最先被大家熟知的应用领域应属搜索引擎&#xff0c;为了…

干货 | 谷歌BERT模型fine-tune终极实践教程

作者 | 奇点机智从11月初开始&#xff0c;Google Research就陆续开源了BERT的各个版本。Google此次开源的BERT是通过TensorFlow高级API—— tf.estimator进行封装(wrapper)的。因此对于不同数据集的适配&#xff0c;只需要修改代码中的processor部分&#xff0c;就能进行代码的…

java简介 ppt 精_《JAVA》5选择结构精篇课件.ppt

《JAVA》5选择结构精篇课件选 择 结 构 if 语句 if – else语句 Switch语句 块作用域语句又被称为复合语句&#xff0c;其格式为&#xff1a;用一对花括号将若干条语句括起来&#xff0c;目的是从语法上可以将多条语句解释成一条语句。 { int temp; temp a; a b; …

UPDATE STATISTICS 有何妙用?

txlicenhe 马可 一直没有关注它&#xff0c;今天刚学到的一招&#xff0c;还没彻底弄清楚。 情况是这样&#xff0c;有一个视图&#xff0c;用到了好几个表&#xff0c;其中一个表改了一些资料&#xff0c;在前台操作时总是超时过期&#xff08;前台设置超时时间不长 60s&#…

js with用法

1&#xff09;简要说明 with 语句可以方便地用来引用某个特定对象中已有的属性&#xff0c;但是不能用来给对象添加属性。要给对象创建新的属性&#xff0c;必须明确地引用该对象。 2&#xff09;语法格式 with(object instance) { //代码块 } 有…

大数据时代,谁的眼神锁定你?

数据时代当前&#xff0c;欢迎来到楚门的世界。双十一余韵未歇&#xff0c;刚处理完一波售后及退件等“剁手后遗症”的各方人马也已经为再战双十二做好了准备。截至 12 日零点&#xff0c;天猫双十一成交额达 2135 亿元。与此同时&#xff0c;据国家邮政局监测数据显示&#xf…

Java类Demo中存在_Java中的数据类型转换

先来看一个题&#xff1a;Java类Demo中存在方法func0、func1、func2、func3和func4&#xff0c;请问该方法中&#xff0c;哪些是不合法的定义&#xff1f;( )public class Demo{float func0(){byte i1;return i;}float func1(){int i1;return;}float func2(){short i2;return i…

Exchange2000需要创建的3个SMTP服务实例

前一阵搞了邮件系统的安全加固&#xff0c;前面说的SA是一个方面&#xff0c;总觉得在SMTP上还有文章可做。分析一下公司的系统环境&#xff0c;SMTP的访问大概分这么三类&#xff1a;1、来自客户端的访问。2、来自公司业务系统服务器的访问。3、来自外部其它邮件服务器的访问。…

小程序门店自提功能开启,酷客多带你玩转O2O模式

目前小程序的发展已经如火如荼&#xff0c;不管是新型行业还是传统行业&#xff0c;都进军小程序领域&#xff0c;由此为广大消费者带来了方便与快捷&#xff0c;现在许多商家品牌将线上线下结合互动起来&#xff0c;推广门店自提的模式&#xff0c;酷客多小程序&#xff08;ht…

“基因编辑婴儿”惹争议,你或许不知道机器学习在脱靶效应中的作用?

作者|琥珀出品| AI科技大本营又一次&#xff0c;计算机科学家和生物学者站在一起&#xff0c;对抗人类向内探索的挑战——用机器学习预测基因编辑 CRISPR 中的脱靶效应。今年年初&#xff0c;发表在《自然》生物工程杂志上的一篇论文描述了 Elevation 这项工具。该工具由微软研…

Flash Player漏洞利用Exploiting Flash Reliably

以下消息来自幻影论坛[Ph4nt0m]邮件组前两天推荐过Mark Dowd的Paper “Exploiting Flash Reliably”[url]http://hi.baidu.com/secway/blog/item/242655971275376855fb96d8.html[/url]学习了一下&#xff0c;很好很强大。为以后Flash Player漏洞的利用开辟了一条崭新崭新的道路…

java好用的hbase库_Hbase入库基于java

计划每周写一篇博客&#xff0c;督促自己快点学习&#xff0c;懒惰会让人上瘾&#xff0c;努力奋斗&#xff0c;不忘初心。某天&#xff0c;忽然来任务&#xff0c;要做hbse入库&#xff0c;之前自学过hbase&#xff0c;感觉挺简单的&#xff0c;网上搜了些model直接撸码&#…

linux(ubuntu)环境下安装及配置JDK

安装完IDEA之后遇到了问题&#xff0c;发现jdk安装完之后配置环境变量好困难,下面总结一下我的安装及配置方式&#xff1a; JDK下载链接&#xff1a;http://download.oracle.com/otn-pub/java/jdk/8u144-b01/090f390dda5b47b9b721c7dfaa008135/jdk-8u144-linux-x64.tar.gz 作者…

专访英特尔AIPG全球研究负责人Casimir Wierzynski:物理学、隐私和大脑将根本性塑造AI...

记者|琥珀出品| AI 科技大本营在 11 月 14 日至 15 日在北京召开的英特尔人工智能大会&#xff08;AIDC&#xff09;上&#xff0c;英特尔人工智能产品事业部&#xff08;AIPG&#xff09;全球研究负责人 Casimir Wierzynski 发表了主题为《人工智能研究——物理学、隐私和大脑…

flash php socket通信_php与flash as3 socket通信传送文件实现代码

前段时间在flashseer看到有人提到:可以通过socket方式传送swf文件,让用户无法获取到swf文件… 当时还没有出as3的反编译,所以对程序的保护没有在意.随着反编译程序的平民化,不希望别人看到源代码的朋友就比较着急…通过socket方式传送swf文件来避免泄漏源代码的思路(只适用as3)…

全线衰退:PC产业一枝孤秀

之三&#xff1a;全线衰退&#xff1a;PC产业一枝孤秀 在3C中&#xff0c;也许个人电脑(PC)产业算是当今中国最有希望的。中国的计算机工业号称已有50年历程&#xff0c;但成为民用产品的起始点应在30年前&#xff0c;与改革开放同时起步。1978年&#xff0c;国家成立了计算机工…

用Gogs在Windows上搭建Git服务

1.下载并安装Git&#xff0c;如有需求&#xff0c;请重启服务器让Path中的环境变量生效。2.下载并安装Gogs&#xff0c;请注意&#xff0c;在Windows中部署时&#xff0c;请下载MiniWinService&#xff08;mws&#xff09;版本。3.在MariaDB中创建一个命名为Gogs的数据库&#…

wamp安装多版本php,WampServer安装多个php版本

早期的WampServer安装多个版本php很简单&#xff0c;只需要单击php下的Get more...就行了&#xff0c;WampServer会自动导航到http://www.wampserver.com/addons_php.php下去安装php&#xff0c;但目前这种方式好像不行了&#xff0c;该页面找不到了&#xff0c;那么我们只能手…

利用Windows自带服务架设免费邮件服务器

在Windows Server 2003中带有完整的SMTP和POP3服务&#xff0c;并且能够支持有域和无域两种环境&#xff0c;非常便于中小型企业实施。今天&#xff0c;小编就以Windows Server 2003企业版为例带领大家架设一台免费的邮件服务器&#xff0c;希望能够对各位朋友学习邮件服务器提…

阿里首次开源深度学习框架X-Deep Learning

今年&#xff0c;各企业在开源路上的势头可以说是“你追我赶”&#xff0c;谁也不甘落后。6 月&#xff0c;小米宣布开源自己在移动端深度学习框架 MACE&#xff1b;9 月&#xff0c;腾讯 AI Lab 宣布开源一款自动化深度学习模型压缩与加速的框架——PocketFlow。双十一刚过&am…

应用基于资产的开发到 SOA 的服务中1

SOA 的主要原则之一是在整个 SOA 生命周期中将服务视为可重用资产。因此&#xff0c;务必在 SOA 中对服务应用正式的资产开发流程和指南。本文可帮助 IT 架构师、项目经理和 SOA 管理员全面了解一些主要 IBM 产品如何协作来帮助有效地在 SOA 中将服务作为可重用资产进行创建、使…

用Piranha来实现WEB的负载均衡

简述&#xff1a;利用(LVSPiranha)基于完整开源软件的架构可以提供一个简单的负载均衡及高可用的服务架构。LVS 集群采用 IP 负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率(在DR模式下),将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故 障,…

SQLServer数据库试题及答案

选择题&#xff1a;&#xff08;20分&#xff09; 1、根据关系数据基于的数据模型——关系模型的特征判断下列正确的一项&#xff1a;&#xff08;___&#xff09; A、只存在一对多的实体关系&#xff0c;以图形方式来表示。 B、以二维表格结构来保存数据&#xff0c;在…

php中怎样阻止网页进行跳转,阻止php页面跳转方法

阻止php页面跳转方法一、 header 函数header()函数的主要功能是将HTTP协议标头(header)输出到浏览器。参数void header (string string [,bool replace [,int http_response_code]])可选参数replace指明是替换前一条类似标头还是添加一条相同类型的标头&#xff0c;默认为替换。…

张宏江:人工智能的长远发展需要有人坐冷板凳

从金山 CEO 退休两年后&#xff0c;除了在源码资本任职投资合伙人&#xff0c;张宏江又在刚刚成立不久的北京智源人工智能研究院担任首届理事长&#xff0c;致力于推动不同行业分享大数据&#xff0c;让从事基础研究院所和 AI 的创业公司更容易获得数据。作为一个横跨产学研、投…

Python 中的进程、线程、协程、同步、异步、回调(一)

在进一步之前&#xff0c;让我们先回顾一下各种上下文切换技术。 不过首先说明一点术语。当我们说“上下文”的时候&#xff0c;指的是程序在执行中的一个状态。通常我们会用调用栈来表示这个状态——栈记载了每个调用层级执行到哪里&#xff0c;还有执行时的环境情况等所有有关…

php iis6 安装ssl证书,在IIS下部署SSL证书实现HTTPS

HTTPS是以安全为目标的HTTP通道&#xff0c;简单讲是HTTP的安全版。谷歌已经制定了一项长远的计划&#xff0c;它的最终目标是将所有通过HTTP协议呈现的网页标为“不安全”&#xff0c;对于站长来说&#xff0c;部署SSL证书来迁移到HTTPS是一个现实和重要的问题&#xff0c;那么…

今晚8点直播 | 微软亚洲研究院副院长刘铁岩:机器学习技术前沿与未来展望

人工智能正受到越来越多的关注&#xff0c;而这波人工智能浪潮背后的最大推手就是“机器学习”。机器学习从业者在当下需要掌握哪些前沿技术&#xff1f;展望未来&#xff0c;又会有哪些技术趋势值得期待&#xff1f; AI科技大本营联合华章科技特别邀请到了微软亚洲研究院副院…

11月最佳机器学习开源项目Top10!

整理 | Jane出品 | AI科技大本营过去一个月&#xff0c;我们从近 250 个机器学习开源项目中挑选出了最受大家关注的前十名。这些项目在 GitHub 上平均 Stars 数为 2713。这些项目涉及由 Google AI Research 开源的 BERT 预训练模型、DeepMind 开源的图网络库、Facebook Researc…