前言

最近有机会了解到了StrangeIoc框架,就拿来跟自己比较熟悉的pureMVC进行一下简要的对比。这两套开源框架都是基于MVC模式的扩展,pureMVC是一个跨平台跨语言的MVC轻量级应用框架,它最早是应用在flash开发中,后来经过不断的发展,现已支持几乎所有的平台,当然在unity开发中应用也很广泛;StrangeIoc是一款基于MVCS的框架,专门C#和Unity而设计,可以直接在Asset Store下载。
pureMVC介绍
pureMVC框架示意图
 

在MVC模式中,应用程序被分为低耦合的三层:Model、View和Controller。PureMVC在此基础上有所扩充,通过模块化设计,可以进一步降低模块间的耦合度,创建了一个易于扩展限制很小的通用框架。
 
PureMVC源码分析
 
1、核心层中是三个单例类:
Model:保存对Proxy对象的引用,Proxy负责操作数据类型
View:保存对Mediator对象的引用,Mediator负责操作具体的视图组件
Controller:保存所有Command的映射,Command执行相关命令。
在实际开发中,你根本不需要关心这三个类,只需调用Facade类的GetInstance方法即可启动pureMVC框架,Facade会自动帮你初始化MVC环境。
 
2、框架内部通讯:
pureMVC内部通讯是基于Observer/Notification 机制(观察者模式)来实现的,只需要使用一个非常简单的方法从 Proxy,Mediator, Command 和 Facade 发送 Notification。
 
3、Facade:
这是pureMVC提供的与核心层通讯的单例类,它负责初始化Model、View、Controller,Proxy、Mediator 和 Command 就可以通过创建的 Facade 类建立起通信机制。
 
4、Mediator
Mediator(中介) 对应MVC中的View.,在实际应用中,Mediator经常与view是绑定的关系, Mediator可以监听View Component发出的Event,开发时,在ListNotificationInterests方法中添加自己关心的Notification, 当关心的Notification发出时, 会执行Mediator的HandleNotification方法中,在这个方法中需要对Notification做处理。Mediator既可以发送通知,也可接收通知。
 
5、Proxy
Proxy通常情况下会暴露一组公共API供Controller(command)或View(mediator)调用,用来对数据进行增删改查。在pureMVC的设计中,proxy只可以发出Notification,而不能接收Notification
 
6、Command
command与Notification是一一对应的,注册Command时,会将Notification与对应Command进行绑定,当该Notification发出时,对应command就会执行它的Excute方法。puremvc中有两种Command:第一种是SimpleCommand ,只有一个 execute 方法,execute 方法参数是一个Inotification 实例。实际应用中,你只需要重写这个方法就行了。第二种是MacroCommand,让你可以顺序执行多个 Command。实际应用中,你需重写这个方法。
 
pureMVC特点:
1、pureMVC巧用了几种设计模式:代理模式 、观察者模式 、中介者模式 、命令模式 、单例模式 。
2、使Model、View、Controller之间耦合降低,但也容易造成了代码冗余量大。
3、pureMVC将Observer/Notification保存在字典中,Notification的传递也都要经过装箱拆箱操作,如果在大型项目中使用pureMVC可能会影响性能。
 
StrangeIoc介绍
框架简介
StrangeIoc 是一个基于MVCS的框架,支持依赖注入。网上很多博文都说strangeIoc是一个依赖注入框架,其实这种说法是不够正确的,这个框架的核心,是绑定。strangeIoc的核心内容就是对绑定进行了包装,可以绑定一个接口到它的实体类上面。或者绑定一个事件到一个处理者上。或者绑定两个类:当一个被实例化时,自动创建另一个的实例。
IOC也被成为控制反转,在StrangeIOC与许多框架通常用这种技巧实现一个ioc容器,将代码内的依赖关系交给第三方(IOC容器)管理,通过容器来实现对象组件的装配和管理。所谓的“控制反转”概念就是对组件对象控制权的转移,从程序代码本身转移到了内部的容器。需要什么类型告诉工厂你要的类型,他会生产给你一个实例,简而言之我们可以看作是一个用来new类型的工厂 。
 
starngeIoc框架示意图

Root(contexView):根节点,继承自MonoBehavior ,创建一个MVCS Context,是MVCS架构的入口。
 
MVCS Context  :进行view与mediator,services接口与实现该接口的类的绑定等。
 
CONTROLLER:大部分逻辑处理放在这一层,连接VIEW和SERVICES,MODELS层,起到数据总管理的作用。
 
VIEW:一切用户可以看到的,均在这一层。细分为view和mediator(中间层),UI和数据分离,view负责显示画面,mediator通过Dispatcher发送数据请求,与CONTROLLER层进行交互,起到数据交流中转站的作用。
 
SERVICES层:服务层,客户端的数据通过SERVICES层与外界交互,连接服务器取得数据。基本上与服务器的数据交流均通过SERVICES层完成。
 
WEB:服务器
 
MODEL:数据模型
 
绑定(Binding)
strange的核心是绑定,绑定的工作都会放在MVCSContext中做, strange的binding由两个必要部分和一个可选部分组成,必要部分是a key and a value  key触发value,比如一个事件可以触发回调,一个类的实例化可以触发另一个类的实例化。可选部分是name。
绑定可以分为injectionbinding  ,commandbinding,mediationbing这三种,注入绑injectionbinding主要是用来绑定该类型对象到上下文,这样使得程序中各个地方可以通过contextview访问得到该对象;commandbinding是为了将事件或信号与命令绑定;mediationbing是将view注入中介mediator中。
 
 
注入(Inject)
注入的功能,就是我们想获得某种类型的对象时不需要自己去创建,只要加上[Inject]标识就可以根据你bind时的规则获得对象,根据这些Inject标识,框架会找到这些属性,通过类型判断按Context中注册的规则将对象的实例赋值给该属性。
 
框架内部通讯
StrangeIOC提供的通讯方式有两种 :一种是IEvent传递,还有一种是通过Signal传递,这两种方式,我们实际开发时使用一种即可,使用IEvent的好处是自己可以继承此接口自己实现自定义的消息体,缺点是每次接收到消息的时候都是以IEvent接口的形式,这是一种类型不安全的做法,同时也会造成不必要的性能损耗。Signal是StrangeIOC框架成熟后提供的,Signal的好处是强类型 ,类型安全也不需要强转,你只需要在接收的地方Inject属性即可,目前,大家开发时都使用signal的方式比较多。
 
总结
pureMVC与strangeIoc都是非常适合unity项目开发,pureMVC框架足够简单,源码除去注释行总共才600多行,看懂源码也不是什么难事,有兴趣的朋友可以去下载研究 https://github.com/PureMVC/puremvc-csharp-standard-framework ,在实际开发中,我们通常也会对pureMVC框架进行扩展,比如加入Service模块,负责与服务器通讯,这也是很方便能实现,同时,针对pureMVC的性能问题,网上也能找到一些优化的方案,pureMVC可扩展性是很强的。strangeIoc框架上手会比strangeIoc困难一些,就像它的名字一样,使用起来确实很奇怪,项目开发中会涉及各种事件和信号调用,调试起来会比较麻烦。框架的作者介绍这是一款轻量级的框架,但这框架的源码有两万多行,这可不算轻量,我看了几眼框架的源码就脑阔痛,但不可否认它确实是一款优秀的框架,通过依赖注入,event&signal传递的方式,大大降低模块之间的耦合,使用起来也很灵活,据我所知腾讯有很多上线项目都用到了这个框架,地址https://github.com/strangeioc/strange-core 。至于在开发时使用哪个框架比较好,这还得看实际情况,但显然pureMVC使用起来成本更低。
 

pureMVC与strangeIoc框架对比的更多相关文章

  1. Unity StrangeIoC框架

    Unity StrangeIoC框架  http://blog.csdn.net/y1196645376/article/details/52746251    

  2. StrangeIoc框架学习----在项目中实战

    最近,因为公司的项目一直在研究StrangeIoc框架,小有所得,略作记录. StrangeIoc是一款基于MVCS的一种框架,是对MVC思想的扩展,是专门针对unity开发的一款框架,非常好用. 一 ...

  3. Android自动化测试框架对比

    1.Monkeyrunner:优点:操作最为简单,可以录制测试脚本,可视化操作:缺点:主要生成坐标的自动化操作,移植性不强,功能最为局限:2.Rubotium:主要针对某一个APK进行自动化测试,AP ...

  4. Android &Swift iOS开发:语言与框架对比

    转载自:http://www.infoq.com/cn/articles/from-android-to-swift-ios?utm_campaign=rightbar_v2&utm_sour ...

  5. 各种ORM框架对比(理论篇,欢迎来观摩)

    各种ORM框架对比 目前框架有以下 PetaPoco Dapper.NET Massive Simple.Data Chain PetaPoco 轻量级,以前单文件,目前有维护形成项目级别,适合多个数 ...

  6. 微服务架构介绍和RPC框架对比

    微服务架构介绍和RPC框架对比 1.微服务架构 1.1 特征 自动化部署,端点智能化,语言和数据的去中心化控制. 1.2架构 一种将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中 ...

  7. TensorFlow与主流深度学习框架对比

    引言:AlphaGo在2017年年初化身Master,在弈城和野狐等平台上横扫中日韩围棋高手,取得60连胜,未尝败绩.AlphaGo背后神秘的推动力就是TensorFlow--Google于2015年 ...

  8. 前端测试框架对比(js单元测试框架对比)

    前端测试框架对比(js单元测试框架对比) 本文主要目的在于横评业界主流的几款前端框架,顺带说下相关的一些内容. 测试分类 通常应用会有 单元测试(Unit tests) 和 功能测试(Function ...

  9. 大数据框架对比:Hadoop、Storm、Samza、Spark和Flink

    转自:https://www.cnblogs.com/reed/p/7730329.html 今天看到一篇讲得比较清晰的框架对比,这几个框架的选择对于初学分布式运算的人来说确实有点迷茫,相信看完这篇文 ...

随机推荐

  1. 【javascript】点击复制内容的实现

    各种站点有很多类似的代码,不过都是拿来即用,连个解释也没有.大概看了一下,现在主要使用的有两种办法: 1.documen.execCommand("Copy")或者window.c ...

  2. [uwp]自定义图形裁切控件

    开始之前,先上一张美图.图中的花叫什么,我已经忘了,或者说从来就不知道,总之谓之曰“野花”.只记得花很美,很香,春夏时节,漫山遍野全是她.这大概是七八年前的记忆了,不过她依旧会很准时的在山上沐浴春光, ...

  3. Enabling Remote Errors in SSRS

    January 18, 2011 By default the remote errors property in SQL Server Reporting Services is set to fa ...

  4. Mounting VMDK files in Linux

    1.用 loop 方式挂载 vmdk 文件 losetup /dev/loop0 docker_pull-flat.vmdk 2.查看分区 [root@localhost]# parted /dev/ ...

  5. es6中export、export default、import的理解

    export 与 import 的使用 export 与import是es6中新增模块功能最主要的两个命令.我们要知道在es6中,实现了模块功能,而且相当简单,意在取代commonjs和AMD规范.成 ...

  6. Maven镜像更换为阿里云中央仓库(精)

    前言 maven仓库默认在国外,使用难免很慢,尤其是下载依赖的时候,换为国内镜像,让你感受飞一般的感觉.国内支持maven镜像的有阿里云,开源中国等,这里换为阿里云的. 更换 修改maven配置文件s ...

  7. [转] 红帽7搭建Zabbix监控

    zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案. zabbix能监视各种网络参数,保证服务器系统的安全运营:并提供灵活的通知机制以让系统管理员快速定位/解决 ...

  8. 初学struts2框架

    昨天初学strts2,折腾了一晚上才正好一个简单的应用程序,在这个过程中遇到了很多的问题. 1. struts2的更新太快,所以从图书馆借的书常常会跟不上变化,所以有时执行起来会很麻烦. 2. 如果你 ...

  9. 判断h5页面是小程序环境还是微信环境

    1.话不多说直接上代码,已使用有效 <script type="text/javascript" src="https://res.wx.qq.com/open/j ...

  10. PTA 这是二叉搜索树吗?

    https://pintia.cn/problem-sets/994805046380707840/problems/994805070971912192 #include<iostream&g ...