Unity StrangeIoC框架

Unity Strange IoC 概览
Unity StrangeIoC(一)



正式之前先说说基础的概念:
首先是MVC框架,MVC框架的思路是将业务逻辑、数据、界面显示分离,网上很多关于MVC的资料,这里不再过多的描述了。
下面截图来自wikipedia的mvc框架:
然后是控制反转(包括依赖注入和依赖查找),控制反转也是著名框架spring框架的核心。
对于控制反转(Inversion of Control,缩写IOC)的依赖注入,先用一个C#示例代码演示一下。比如设计一个玩家攻击敌人的游戏,玩家可以装备手枪,步枪。最简单的代码设计实现如下:

public   class   Player
{
     public   string   gunName =  "ShouQiang" ;
     public   void   Attack(Enemy enemy)
     {
         if (gunName ==  "ShouQiang" )
             enemy.hp -= 10;
         else   if (gunName =  '' BuQiang")
         ememy.hp -= 20;
     }
}

如上述代码,假如项目中多了一个(机枪),需要重写player类,重写攻击逻辑(if..else)设计不合理。重新设计,代码可以用下面的方实现:

public   interface   IGun {
     voidAttack(Enemy eneny);
}
public   class   ShouQiang : IGun
{
     public   void   Attack(Enemy eneny)
     {
         enemy.hp -=10;
     }
}
public   class   BuQiang : IGun
{
     public   void   Attack(Enemy enemy)
     {
         enemy.hp -= 20;
     }
}
public   class   Player
{
     public   IGun gun = newShouQiang(); 
     public   void   Attack(Enemy enemy)
     {
         gun. Attack(enemy);
     }
}
public   class   Eneny
{
     public   int   hp;
}

如果再增加机枪,直接增加一个机枪类继承IGun接口就可以了 playe类中
public IGun gun = new ShouQiang();简单实现了一个注入.

下面正式介绍strangeioc.
正如strangeioc描述的一样,总体上说它是根据控制反转和解耦和原理设计的,支持依赖注入. 继续引入一个示例,如果写一个单玩家游戏,死亡后将最高分数提交到facebook ,代码如下:

public   class   MyShip: MonoBehaviour {
     private   FacebookService facebook;
     private   int   myScore,
     void   Awake()
     {
         facebook = FacebookService.getlnstance(),
     }
     void   onDie()
     {
         if   (score > highScore) 
             facebook.PostScore(myScore),
     }
}

这样做有两个问题:
1.ship作为控制角色,但是除了要通知facebook上传分数还要处理代码逻辑.将自身与游戏逻辑与 facebook逻辑关联(髙耦合)
2.FacebookService是单键,如果我们改为要提交到Twitter..or Google+... 怎么办?或者FacebookService里面的方法有变更怎么办?
如果代码如上,需要重构很多代码才能完成相应的功能,但是通过引入ioc,重构将会方便很多。

public   class   MyShip : MonoBehavior
{
     void   OnDie()
     {
         dispatcher.Dispatch(GameEvent.SHIP_DEAD);
     }
}

视图模块出发了死亡逻辑,它(View)需要知道的仅仅是这些就够了,然后将死亡消息发送出去。
某个模块的代码用来接收死亡消息,然后做出处理,如下:

public   class   OnShipDeathCommand: EventCommand
{
     [Inject]
     ISocialService socialService { get set ,}

     [Inject]
     IScoreModel scoreModel { get   set ,}

     public   override   void   Execute()
     {
         if   (scoreModel.score > scoreModel.highScore) 
             socialService.PostScore(scoreModel.score);
     }
}

[Inject]标签实现接口,而不是实例化类 

#if UNITY_ANDROID
injectionBinder.Bind<ISocialService>().To<GoogleService>().AsSingleton();
#else
injectionBinder.Bind<ISocialService>().To<FacebookService>().AsSingleton(); 
#endif
//...or...
//injectionBinder.Bind<ISocialService>().To<MultiServiceResolver>().AsSingleton();
 
injectionBinder.Bind<IScoreModel>() To<ScoreMcxiel>() AsSIngleton();
commandBinder.Bind(GameEvent.SHIP_DEAD , OnShipDeathCommand);

用IOC(控制反转)我们不用关注具体逻辑,也不同自己再创建单键。
ship触发Command来执行逻辑,每个模块之间都是独立的。
1> commandBinder.Bind(GameEvent.SHIP_DEAD , OnShipDeathCommand);
将事件和对应逻辑绑定在了一起。

2> dispatcher.Dispatch(GameEvent.SHIP_DEAD)
就是发出事件,但是具体做什么事情不需要了解。
前言 unity框架,除了各大公司自己内部使用的,开源并好用的实际并不是很多,我会慢慢挖掘,依次写出自己的一点见解,错误的地方,望各路大神指正。 一、基本概念 控制反转(Inversion of Control,英文缩写为IOC),我的理解就是,原本A类要获取B类的对象,需要你在A类中自己New一个对象,那么是由A来获取并控制B的对象,IOC就是把对象获取的这个过程交给容器和依赖注入来处理,A类并不知道B的对象是哪里来的,对B对象的控制,由自己变成了其他类,官方一点的概念可以百度,这个还是蛮多的。 二、StrangeIOC基础类型 实际要理解一个框架的类型,还是要自己看源码,这里我只说一下几个重要类型的作用,这个看源码的时候有个印象,也方便理解,而且说这部分的帖子也很多,我就不再赘述了。 1.Context 上下文组件定义程序边界,也就是可以把一个程序定义成多上下文,让代码更加模块化 它提供了程序入口,也算是框架中耦合度最高的地方 2.Binder和Binding 这两个类是这个框架最重要的组成部分 Binding存储了对象的绑定关系,而Binder存储了Binding的对象 3.View和Mediator MVCS中的View层,View只用于显示,也就是View只负责管理UI,Mediator负责界面逻辑,事件响应等 4.Model MVCS中的Model层,负责数据部分 5.Command MVCS中的Control层,负责执行逻辑代码 6.Service MVCS中的Service层,负责与第三方交互,这个Service我理解的,并不是一定指代服务器,也可以是其他的软件,什么都可以,它就是我们程序对外的接口 7.Dispatcher 派发器是框架内通信主线的其中一种,用来派发消息,触发命令,从而进一步解耦 8.Signal 信号是框架内另外一种通信主线,它采用强类型,来绑定信号和命令之间的关系,实现消息响应的触发 9.ReflectionBinder 反射部分,通过binding来获取类的信息,存储在ReflectedClass中 10.injector 注入器,通过反射获取的信息,来实例化请求的对象 --------------------- 作者:蓝天小僧 来源:CSDN 原文:https://blog.csdn.net/zcaixzy5211314/article/details/80876228 版权声明:本文为博主原创文章,转载请附上博文链接!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值