CN107515793A - 一种支持消息机制的模块通信方法 - Google Patents
一种支持消息机制的模块通信方法 Download PDFInfo
- Publication number
- CN107515793A CN107515793A CN201710720836.2A CN201710720836A CN107515793A CN 107515793 A CN107515793 A CN 107515793A CN 201710720836 A CN201710720836 A CN 201710720836A CN 107515793 A CN107515793 A CN 107515793A
- Authority
- CN
- China
- Prior art keywords
- message
- send
- communication means
- manager
- hook
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/546—Message passing systems or structures, e.g. queues
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Transfer Between Computers (AREA)
Abstract
本发明公开了一种支持消息机制的模块通信方法,方法步骤如下,步骤一、创建一个消息字典MsgID;步骤二、创建一个消息的基类BaseMsg;步骤三、创建一个消息管理器MsgManager;步骤四、创建一个自定义消息msg1,继承BaseMsg,在消息接收对象B的初始化方法中注册该消息的消息监听,绑定执行方法fun(),在消息发送对象A中,需要发送消息的地方,通过post或send方式发送该消息msg1,这样当A发送完消息后,在B中监听的方法就会被立即执行。与现有技术相比,本发明让模块在良好通信的基础上,通过引入本地消息通信机制,使模块脱耦,利于模块的扩展就能很好地解决上述问题。
Description
技术领域
本发明涉及一种涉及编程设计模式领域,多模块、原生构建(非容器注入)的应用程序开发,应用最广的是flash网页游戏,尤其涉及一种支持消息机制的模块通信方法。
背景技术
在任何语言构建的中大型应用中,都有很多模块,如何让这些模块彼此间能通信,需要花心思去思考和设计架构,以符合良好的扩展性。这里抛开像javaEE等带有容器注入的服务器架构,讨论的是基于flash自行实现的框架。Flash本身即可以看做一个纯前端(V),但同时它作为一个运行时,内部也可以包含控制器(C)和数据模型(M)的构建和处理。像很多大中小型网页游戏,都用flash去构建整个表现。一个flash应用中,包含若干个模块。如网页游戏,往大了分,有地图模块、角色模块、任务模块、背包模块、商城模块、战斗模块、好友模块、组队模块等等;每个大模块下又分为若干个子模块,如角色模块下,包含男性玩家、女性玩家、NPC等。这些模块之间,可能都存在联系。如一个男性玩家砍杀掉一个带任务的BOSS的时候,会通知任务模块完成了一个任务,同时还会通知广播***向全服务器广播砍杀了boss,可能还会向好友广播获得了什么极品装备、向成就***绑定新的成就、向背包***更新新收获的物品等等。也就是说,一个事件,可能会触发若干个其他事件,而这些事件分散在不同的模块中。很早之前的做法是使用“单例模式+组合”,哪个模块需要改变,就直接调用该模块下的方法。这样的耦合度非常高,很容易出错,而且对扩展和维护极不方便。
在Windows***中,程序是事件驱动的,所有的IO输入都Windows监控,当一个事件发生时,Windows先将输入的消息放入***消息队列中,然后再将输入的消息拷贝到相应的应用程序队列中,应用程序中的消息循环从它的消息队列中检索每一个消息并发送给相应的窗口函数中进行事件的处理。在flash中,flash本身也有事件机制(Event),并且事件机制有一套完整的事件流。但该事件机制要求事件的监听者必须继承IEventDispatcher接口;事件的自定义可控性不强,比如不能hook;在注册事件时,还是会发生耦合(比如使用组合来申明成员变量或者单例)。
发明内容
本发明的目的就在于提供一种解决上述问题,基于flash的本地消息通信机制
支持消息机制的模块通信方法。
为了实现上述目的,本发明采用的技术方案是:一种支持消息机制的模块通信方法,其特征在于:方法步骤如下,
步骤一、创建一个消息字典MsgID,用于保存所有自定义消息的ID;
步骤二、创建一个消息的基类BaseMsg,其余任何自定义消息继承该基类;
步骤三、创建一个消息管理器MsgManager,负责消息的监听、发送、执行、注销的内部机制实现;
步骤四、创建一个自定义消息msg1,继承BaseMsg,该消息中有一个消息ID:msgID,绑定到MsgID中的一个ID中,设定对象A为消息发送对象,对象B为消息接收对象(监听者),fun()方法为消息的具体监听方法,在消息接收对象B的初始化方法中注册该消息的消息监听,绑定执行方法fun(),在消息发送对象A中,需要发送消息的地方,通过post或send方式发送该消息msg1,这样当A发送完消息后,在B中监听的方法就会被立即执行。发送消息方法如下,在B中的初始化方法中注册该消息的消息监听,通过MsgManager.registerMsg(msgID,fun),绑定执行方法fun();在对象A中要调用对象B fun()的地方,委托MsgManager发送该消息msg1,msg1为MsgManager.postMsg(msg1)或者MsgManager.sendMsg(msg1)。
作为优选,该方法是基于flash自行实现的框架,Flash本身即看做一个纯前端(V),但同时它作为一个运行时,内部也可以包含控制器(C)和数据模型(M)的构建和处理,本专利是基于flash,但思想可用于任何语言。
作为优选,在步骤四中,在消息管理器MsgManager内创建一个消息队列(例如:数组Array类型),用于缓存post发送过来的消息,以便执行异步处理。
作为优选,步骤四中,在消息管理器MsgManager内创建registerMsg方法,该方法接收负责接收msgID、消息回调函数两个参数,将msgID作为key创建数组,回调函数存入数组(即观察者),以便在接收到send或post过来的消息时,能广播到所有观察者,执行所有消息回调。
作为优选,步骤四中,在消息管理器MsgManager中,创建postMsg方法和sendMsg方法,这两个方法用于发送消息,post是发送后延迟调用(即异步执行消息回调),send是发送后立即调用(即同步执行),两个方法都接受一个参数msg,即BaseMsg的子类对象,通过send过来的消息,会将msg对象的msgID取出,从消息队列中遍历寻找,找出该消息ID对应的所有观察者,然后立即执行这些观察者的消息回调,通过post过来的消息,不会立即执行,而是先放入另一个消息执行队列,然后通过时间片异步执行。
作为优选,通过post发送过来的消息,被放在消息队列中,通过一个timer去定时检查,一旦检测到队列不为空,就按一定时间间隔从队列中取出(shift)消息来执行;而通过send发送过来的消息,不放入消息队列,而是立即执行。
作为优选,步骤四中,消息管理器MsgManager处理消息流转,消息接收对象中监听到消息返回,执行方法fun()。
作为优选,步骤三中,消息管理器主要使用的观察者模式,将消息分发到相应的观察者上,最后监听者执行相应的方法;同时消息可以被hook,钩子消息监听者先注册消息hook监听,消息发送者再发送消息,消息管理器根据hook消息列表,拦截消息,将消息分发到相应的观钩子上,最后钩子执行相应的hook方法。
与现有技术相比,本发明的优点在于:本发明让模块在良好通信的基础上,利于扩展和维护,从而让***更健壮。(抛开很多框架提供的容器注入,只针对原生开发)传统的模块间的通信,要么使用组合,直接调对象的方法,这样耦合度相当高;要么使用语言本身自带的事件机制,这样具有一定的局限性。通过引入本地消息通信机制,使模块脱耦,利于模块的扩展就能很好地解决上述问题。,开发者在开发多模块应用时能感受到该方案的便捷。
附图说明
图1为正常消息流程示意图;
图2为带有hook机制的消息流程示意图。
具体实施方式
下面将对本发明作进一步说明。
实施例1:本发明一种支持消息机制的模块通信方法,施行于本地消息通信机制,所谓本地,就是消息不经过网络,只在应用内部流通;所谓“消息通信”,就是发送、接收消息。有点像http通信的send、post,只不过全过程在应用内部而没有走网络。也有点像js中的事件,分为事件监听者、事件发送者、事件执行者,只不过和事件处理还是不同。本发明的通讯方法,可把所有模块间的通信看成一条一条的“本地消息”,有一个消息管理器和一张消息列表,消息管理器管理消息的注册监听、发送、接收;消息列表管理每条消息的唯一ID。在需要发送消息的地方,让消息管理器来代理发送消息(send和post);在需要接受消息的地方,让消息管理器代理来接受消息(先注册regist)。消息的发送方和接收方互不认识,发送的只管发送出去,接收的只管接收进来,以达到完全解耦。消息管理器主要使用的观察者模式。同时,消息可以被hook,以便解决一些突发性活。
正常的消息流程,参见图1,消息管理器运用观察者模式构建消息体系;监听者先注册消息监听,消息发送者再发送消息;管理器负责将消息分发到相应的观察者上,最后监听者执行相应的方法,整个消息通信机制有5个角色:消息管理器、消息ID字典、消息、消息发送者、消息接收者(也称监听者)。按照传统的组合调用“对象A调用对象B的fun()方法”,放到消息机制中来,那么对象A就是消息的发送者,对象B就是消息的接收者(监听者),fun()方法就是消息的具体监听方法。
一种支持消息机制的模块通信方法,具体方法步骤如下,
首先,创建一个一个消息字典MsgID,再创建一个消息的基类BaseMsg和一个消息管理器MsgManager。MsgID中,保存所有消息的ID。每个自定义的消息都继承BaseMsg,同时在MsgID中绑定一个ID。MsgManager中,负责消息的监听、发送、执行、注销的内部机制实现。其次,创建一个自定义消息msg1,继承BaseMsg;在B中的初始化方法中注册该消息的消息监听(通过MsgManager.registerMsg(msgID,fun)),绑定执行方法fun();在A中要调用B.fun()的地方,委托MsgManager发送该消息msg1(MsgManager.postMsg(msg1),或者MsgManager.sendMsg(msg1))。这样,当A发送完消息后,在B中监听的方法就会被执行。上述所讲到的post和send,是两种发送消息的方式,不同于http协议中的post和send,这里的post是发送后延迟调用,send是发送后立即调用,具体实现是在MsgManager中,通过post发送过来的消息,被放在消息队列中,通过一个timer去定时检查,一旦检测到队列不为空,就按一定时间间隔从队列中取出(shift)消息来执行;而通过send发送过来的消息,不放入消息队列,而是立即执行
在消息管理器MsgManager内创建一个消息队列(例如:数组Array类型),用于缓存post发送过来的消息,以便执行异步处理。
在消息管理器MsgManager内创建registerMsg方法,该方法接收负责接收msgID、消息回调函数两个参数,将msgID作为key创建数组,回调函数存入数组(即观察者),以便在接收到send或post过来的消息时,能广播到所有观察者,执行所有消息回调。
在消息管理器MsgManager中,创建postMsg方法和sendMsg方法,这两个方法用于发送消息,post是发送后延迟调用(即异步执行消息回调),send是发送后立即调用(即同步执行),两个方法都接受一个参数msg,即BaseMsg的子类对象,通过send过来的消息,会将msg对象的msgID取出,从消息队列中遍历寻找,找出该消息ID对应的所有观察者,然后立即执行这些观察者的消息回调,通过post过来的消息,不会立即执行,而是先放入另一个消息执行队列,然后通过时间片异步执行。
消息管理器MsgManager处理消息流转,消息接收对象中监听到消息返回,执行方法fun()。
消息管理器主要使用的观察者模式,将消息分发到相应的观察者上,最后监听者执行相应的方法;同时消息可以被hook,带有hook机制的消息流程,参见图2,钩子消息监听者先注册消息hook监听,消息发送者再发送消息,消息管理器根据hook消息列表,拦截消息,将消息分发到相应的观钩子上,最后钩子执行相应的hook方法。
而本方案的本地消息通信机制,不要求消息的监听者实现任何接口或继承任何类型,而是委托给消息管理器去监听;能手动hook,截断消息去做其他事;完全脱耦,消息的发送者和接受者都分别只跟消息管理器打交道,互相不清楚对方的存在。本方案中的消息通信机制,可以跟很多框架相结合(而并非取代),如MVC;同时还能跟语言自带的事件机制完美融合(也并非取代)。
以上对本发明所提供的一种支持消息机制的模块通信方法进行了详尽介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,对本发明的变更和改进将是可能的,而不会超出附加权利要求所规定的构思和范围,综上所述,本说明书内容不应理解为对本发明的限制。
Claims (8)
1.一种支持消息机制的模块通信方法,其特征在于:方法步骤如下,
步骤一、创建一个消息字典MsgID,用于保存所有自定义消息的ID;
步骤二、创建一个消息的基类BaseMsg,其余任何自定义消息继承该基类;
步骤三、创建一个消息管理器MsgManager,负责消息的监听、发送、执行、注销的内部机制实现;
步骤四、创建一个自定义消息msg1,继承BaseMsg,该消息中有一个消息ID:msgID,绑定到MsgID中的一个ID中,设定对象A为消息发送对象,对象B为消息接收对象(监听者),fun()方法为消息的具体监听方法,在消息接收对象B的初始化方法中注册该消息的消息监听,绑定执行方法fun(),在消息发送对象A中,需要发送消息的地方,通过post或send方式发送该消息msg1,这样当A发送完消息后,在B中监听的方法就会被立即执行。
2.根据权利要求1所述的一种支持消息机制的模块通信方法,其特征在于:该方法是基于flash自行实现的框架。
3.根据权利要求1或2所述的一种支持消息机制的模块通信方法,其特征在于:在步骤四中,在消息管理器MsgManager内创建一个消息队列,用于缓存post发送过来的消息。
4.根据权利要求3所述的一种支持消息机制的模块通信方法,其特征在于:步骤四中,在消息管理器MsgManager内创建registerMsg方法,该方法接收负责接收msgID、消息回调函数两个参数,将msgID作为key创建数组,回调函数存入数组,以便在接收到send或post过来的消息时,能广播到所有观察者,执行所有消息回调。
5.根据权利要求4所述的一种支持消息机制的模块通信方法,其特征在于:步骤四中,在消息管理器MsgManager中,创建postMsg方法和sendMsg方法。这两个方法用于发送消息,post是发送后延迟调用,send是发送后立即调用,两个方法都接受一个参数msg,即BaseMsg的子类对象,通过send过来的消息,会将msg对象的msgID取出,从消息队列中遍历寻找,找出该消息ID对应的所有观察者,然后立即执行这些观察者的消息回调,通过post过来的消息,不会立即执行,而是先放入另一个消息执行队列,然后通过时间片异步执行。
6.根据权利要求5所述的一种支持消息机制的模块通信方法,其特征在于:通过post发送过来的消息,被放在消息队列中,通过一个timer去定时检查,一旦检测到队列不为空,就按一定时间间隔从队列中取出(shift)消息来执行;而通过send发送过来的消息,不放入消息队列,而是立即执行。
7.根据权利要求1或2所述的一种支持消息机制的模块通信方法,其特征在于:步骤四中,消息管理器MsgManager处理消息流转,消息接收对象中监听到消息返回,执行方法fun()。
8.根据权利要求1或2所述的一种支持消息机制的模块通信方法,其特征在于:步骤三中,消息管理器主要使用的观察者模式,将消息分发到相应的观察者上,最后监听者执行相应的方法;同时消息可以被hook,钩子消息监听者先注册消息hook监听,消息发送者再发送消息;消息管理器根据hook消息列表,拦截消息,将消息分发到相应的观钩子上,最后钩子执行相应的hook方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710720836.2A CN107515793A (zh) | 2017-08-22 | 2017-08-22 | 一种支持消息机制的模块通信方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710720836.2A CN107515793A (zh) | 2017-08-22 | 2017-08-22 | 一种支持消息机制的模块通信方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN107515793A true CN107515793A (zh) | 2017-12-26 |
Family
ID=60723462
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201710720836.2A Pending CN107515793A (zh) | 2017-08-22 | 2017-08-22 | 一种支持消息机制的模块通信方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN107515793A (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108182121A (zh) * | 2017-12-29 | 2018-06-19 | 广州小鹏汽车科技有限公司 | 一种Android中控大屏***模块间通信方法及*** |
CN108762943A (zh) * | 2018-03-22 | 2018-11-06 | 武汉斗鱼网络科技有限公司 | 获取通知内部实现过程的方法、终端设备及存储介质 |
CN109669787A (zh) * | 2018-12-05 | 2019-04-23 | 恒生电子股份有限公司 | 数据传输方法及装置、存储介质、电子设备 |
CN110413271A (zh) * | 2019-07-26 | 2019-11-05 | 福建省天奕网络科技有限公司 | 基于Unity3D生命周期的智能消息管理方法 |
CN111061576A (zh) * | 2019-11-29 | 2020-04-24 | 深圳猛犸电动科技有限公司 | 一种实体对象的创建方法及*** |
Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20030023952A1 (en) * | 2001-02-14 | 2003-01-30 | Harmon Charles Reid | Multi-task recorder |
US6668284B1 (en) * | 1998-11-04 | 2003-12-23 | Beckman Coulter, Inc. | Software messaging system |
US20060031362A1 (en) * | 2004-07-01 | 2006-02-09 | International Business Machines Corporation | Method and apparatus for instant messaging |
CN101141417A (zh) * | 2007-10-24 | 2008-03-12 | 中兴通讯股份有限公司 | 设备中任务间消息通信的方法 |
US20080134155A1 (en) * | 2006-11-30 | 2008-06-05 | Ncr Corporation | System and method for interpreting a specification language file to implement a business system |
CN102402457A (zh) * | 2010-09-17 | 2012-04-04 | 希姆通信息技术(上海)有限公司 | 手机应用程序交互事件的处理方法 |
CN103995752A (zh) * | 2014-06-16 | 2014-08-20 | 上海斐讯数据通信技术有限公司 | 模块间通知回调方法及模块交互结构 |
-
2017
- 2017-08-22 CN CN201710720836.2A patent/CN107515793A/zh active Pending
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6668284B1 (en) * | 1998-11-04 | 2003-12-23 | Beckman Coulter, Inc. | Software messaging system |
US20030023952A1 (en) * | 2001-02-14 | 2003-01-30 | Harmon Charles Reid | Multi-task recorder |
US20060031362A1 (en) * | 2004-07-01 | 2006-02-09 | International Business Machines Corporation | Method and apparatus for instant messaging |
US20080134155A1 (en) * | 2006-11-30 | 2008-06-05 | Ncr Corporation | System and method for interpreting a specification language file to implement a business system |
CN101141417A (zh) * | 2007-10-24 | 2008-03-12 | 中兴通讯股份有限公司 | 设备中任务间消息通信的方法 |
CN102402457A (zh) * | 2010-09-17 | 2012-04-04 | 希姆通信息技术(上海)有限公司 | 手机应用程序交互事件的处理方法 |
CN103995752A (zh) * | 2014-06-16 | 2014-08-20 | 上海斐讯数据通信技术有限公司 | 模块间通知回调方法及模块交互结构 |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108182121A (zh) * | 2017-12-29 | 2018-06-19 | 广州小鹏汽车科技有限公司 | 一种Android中控大屏***模块间通信方法及*** |
CN108182121B (zh) * | 2017-12-29 | 2020-10-20 | 广州小鹏汽车科技有限公司 | 一种Android中控大屏***模块间通信方法及*** |
CN108762943A (zh) * | 2018-03-22 | 2018-11-06 | 武汉斗鱼网络科技有限公司 | 获取通知内部实现过程的方法、终端设备及存储介质 |
CN109669787A (zh) * | 2018-12-05 | 2019-04-23 | 恒生电子股份有限公司 | 数据传输方法及装置、存储介质、电子设备 |
CN110413271A (zh) * | 2019-07-26 | 2019-11-05 | 福建省天奕网络科技有限公司 | 基于Unity3D生命周期的智能消息管理方法 |
CN110413271B (zh) * | 2019-07-26 | 2022-04-05 | 福建省天奕网络科技有限公司 | 基于Unity3D生命周期的智能消息管理方法 |
CN111061576A (zh) * | 2019-11-29 | 2020-04-24 | 深圳猛犸电动科技有限公司 | 一种实体对象的创建方法及*** |
CN111061576B (zh) * | 2019-11-29 | 2024-04-09 | 深圳猛犸电动科技有限公司 | 一种实体对象的创建方法及*** |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107515793A (zh) | 一种支持消息机制的模块通信方法 | |
CN105376083B (zh) | 节能控制方法、管理服务器和网络设备 | |
CN109120426A (zh) | 一种网络切片管理方法、装置及计算机可读存储介质 | |
CN110392052A (zh) | 一种区块链智能合约处理***及方法 | |
US20120198004A1 (en) | System and method for managing multiple queues of non-persistent messages in a networked environment | |
CN107172187A (zh) | 一种负载均衡***和方法 | |
US10848579B2 (en) | Systems, apparatuses, and methods for intelligent network communication and engagement | |
CN109639782A (zh) | 消息发送平台、方法 | |
CN106302090B (zh) | 一种消息处理方法、装置及*** | |
CN104410982B (zh) | 一种无线异构网络中终端聚合与重构方法 | |
CN109327513A (zh) | 交互方法、装置及计算机可读存储介质 | |
CN107332866A (zh) | 一种输变电状态监测方法、设备及*** | |
CN111614618A (zh) | 一种面向物理隔离装置的跨区域数据传输方法和*** | |
CN106131141B (zh) | 一种分布式集群负载均衡并行调度***及方法 | |
CA2606919A1 (en) | Method, system and apparatus for automatic notification to a plurality of communication nodes | |
JP2008109657A5 (zh) | ||
CN107517238A (zh) | 一种用于物联网的智能设备控制方法、装置和设备 | |
WO2018188381A1 (zh) | 一种软件模块间的事件路由框架及方法 | |
CN110611687A (zh) | 基于Redis的远程过程调用实现方法和相关装置 | |
Du et al. | ML-SLD: A message-level stateless design for cloud-native 5G core network | |
CN105490960A (zh) | Sdn架构、基于sdn架构的报文转发方法 | |
CN106997537A (zh) | 用于投诉的信息处理方法、装置及*** | |
WO2012174838A1 (zh) | 一种网元消息并发处理方法及*** | |
CN110290139B (zh) | 消息传输方法及装置 | |
CN110071952A (zh) | 服务调用量的控制方法和装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20171226 |
|
RJ01 | Rejection of invention patent application after publication |