事件与委托---实现事件分发中心

原创 2015年11月18日 21:24:11

写在前面

在看一个商业源码的时候,突然发现有一个EventDispatcher类,而且这个类异常庞大,职责就是把这个项目的全部事件都在里面声明。看着那么高大上的事件分发中心,我也只能马上加到我的项目里面来提升一下逼格了。



知识准备


首先是这个事件分发中心的知识,就是用事件和委托来实现方法的回调。那么什么是事件呢,事件和委托又有什么剪不断理还乱的关系呢???
delegate:委托,c#中的代理和c++的函数指针很像,如果熟悉c++的话应该很容易理解,c#用代理的形式实现了函数指针,但是delegate的功能要多很多,比如,delegate确保回调方法是类型安全的。delegate就是一个类,c#通过委托来提供回调函数机制


event:事件,事件在代理模型上添加了一层保护,如下面的例子,levelUp是一个代理,levelupEvent事件的声明做了两件事情,一、它声明了一个名为levelupEvent的代理成员变量,在类的内部里面可以使用,二、它声明了一个名为levelupEvent的公共事件,这样的话该事件可以从类的外部使用。我们就可以实现观察者模式。

public delegate void levelUp();
public event levelUp levelupEvent;
public void OnLevelUp()
{
    if (levelupEvent != null)
    {
        levelupEvent();
    }
}

代码实现

比如现在穿上一件装备,要在人物属性面板上同步更新属性的增益值,就可以在事件分发中心EventDispatcher这样定义
/// <summary>
/// 装备穿上的事件
/// </summary>
public delegate void EquipPutOn();
public event EquipPutOn EquipPutOnEvent = null;
public void OnEquipPutOnEvent()
{
    
    if (EquipPutOnEvent != null)
    {
     
        EquipPutOnEvent();
    }
}

然后在控制人物属性面板的类中用"+="操作符去添加监听方法updateShow来更新显示

void Awake()
{
    initUI();
    registerEvent();
    this.gameObject.SetActive(false);
    EventDispatcher.GetInstance().EquipPutOnEvent += this.updateShow;
}

有添加监听方法,自然就有取消注册监听方法,记得在OnDestroy中调用"-="
void OnDestory()
{
    EventDispatcher.GetInstance().levelupEvent -= this.updateShow;
}
最后,就是触发这个事件,调用全部登记这个监听的函数
<pre class="csharp" name="code"> //穿上装备改变属性
 public void putOnEquipChangeAttribute(int id)
 {
     invertoryInfo info = invertorysInfo.getInvertoryInfoById(id);
     if (info.type == invertoryType.EQUI)
     {
         addPlayerAttributeByEquip(info);
         EventDispatcher.GetInstance().OnEquipPutOnEvent();
     }
 }


<h1><span style="color:#ff0000;">事件分发中心</span></h1><span style="font-size:18px"></span><div>事件分发中心,就是把监听事件统一管理,实现观察者模式,代码如下</div><pre class="csharp" name="code">using UnityEngine;
using System.Collections;

public class EventDispatcher {

    static public EventDispatcher Instance;
    static public EventDispatcher GetInstance()
    {
        if (Instance == null)
        {
            Instance = new EventDispatcher();
        }
        return Instance;
    }

    /// <summary>
    /// 装备穿上的事件
    /// </summary>
	public delegate void EquipPutOn();
    public event EquipPutOn EquipPutOnEvent = null;
    public void OnEquipPutOnEvent()
    {
        
        if (EquipPutOnEvent != null)
        {
         
            EquipPutOnEvent();
        }
    }

    /// <summary>
    /// 角色升级
    /// </summary>
    public delegate void levelUp();
    public event levelUp levelupEvent;
    public void OnLevelUp()
    {
        if (levelupEvent != null)
        {
            levelupEvent();
        }
    }
}








相关文章推荐

unity中事件分发系统 EventDispatcher

出处:http://blog.csdn.net/u010019717author:孙广东      时间:2015.3.21     23:00不使用C#中的event关键字: 只是使用delegat...

Unity3D (C#)事件分发机制的实现

金钱和能量的加减操作 //声明一个委托类型 public delegate void VoidCall(GameObject go); //声明一个事件 public event VoidCa...

THREEJS的鼠标事件实现(中心旋转,放大缩小等)

最近使用threejs自带的TrackballControls.js或者OrbitControls.js发现一个问题:在场景中在一个平行光,当移动物体时,背面始终是黑的,因为没有光照,(本质就是因为使...

基于事件分发实现listview顶部悬浮

  • 2016年01月05日 17:10
  • 2.54MB
  • 下载

SOUI中事件中心的使用

在soui中为了方便将工作者线程中的处理结果及时反馈到UI线程设计了事件中心来解决此类问题。 在使用事件中心需要注意的事项如下: 首先, 要new一个事件中心对象,既然new了对象当然就要de...
  • ceffans
  • ceffans
  • 2017年10月31日 15:23
  • 80

事件分发实现listview顶部悬浮

  • 2016年01月29日 17:47
  • 2.54MB
  • 下载

委托与事件实现

  • 2012年04月17日 21:26
  • 4KB
  • 下载

没有BAT3级的应急响应中心,互联网公司该如何应对数据泄露事件?

有一句流行的鸡汤文大家都耳熟能详——我们走的太快,灵魂都跟不上了。这两天网易邮箱的数据泄露事件,又一次将我们的关注从“爆发性创新与指数级增长”拉回来审视当前糟糕的互联网基础环境,也许我们业务走的太快,...

c#委托事件的实现

  • 2016年01月09日 14:10
  • 1.44MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:事件与委托---实现事件分发中心
举报原因:
原因补充:

(最多只允许输入30个字)