Unity如何实现网络通讯(三):观察者模式以及在网络模块的应用

来源:互联网 发布:啾米网络是培训机构吗? 编辑:程序博客网 时间:2024/06/05 11:24
    首先我们来说一下什么叫观察者模式。观察者模式,顾名思义,就是观察,那么就会有观察者和被观察者,比如在军队中,所有的军人要听长官的指示,军人就是观察者,长官就是被观察者,长官一声号令:“向左转!”,长官所有的监听者就会执行向左转的方法,那么这就是一个观察者模式的流程,我们只需要通过代码来模拟现实生活中的事情,并将之抽象即可。
    在我们的代码中,如果没有一个良好的设计模式、框架,就会产生如下现象:A做饭比较忙让B去买一包盐,但B说没有钱,于是C又给B拿钱,B拿到钱后,又说没有交通工具,于是D拿着B的钱坐着自己的交通工具去买盐了,这样,盐终于买回来了,A才把饭做完了。在这里我们会发现执行效率很差,因为B听A的,C、D听B的,如果让BCD同时听A的号令,A说买盐了,B主动要钱,C提前准备好钱,D准备好交通工具拿钱走人,这样就起到了非常好的效果。
    于是,我们在代码中就有了观察者和被观察者,而为了处理之间的观察关系,我们又抽象出了一个管理观察关系的类,也是实现观察者模式的核心。
publicList<Action> handlerList = new List<Action>();
       public void Dispatch()
        {
           foreach (Actionitem in handlerList)
            {
                item();
            }
        }
以上是简易版代码,当被观察者做出了指示,就会调用派发方法。而所有观察者都被存在列表中,当派发方法执行,观察者就会执行各自对应的方法。
那么如果被观察者做出不同的指示,就会有不同的观察者,比如长官指示第一列队向左转,第二列队是绝对不能动的,所以我们需要给被观察者的指示进行分类,我们原来使用的是List来存储所有的观察者,观察的是同一个指示,那么如果我们有多个指示,该怎么做呢。
    很明显,我们就需要引入字典Dictionary<指示类型,所有的监听者>;
    当被观察者做出指示时,需要声明指示的类型,然后从字典中取出对应的监听者,来执行对应的方法。我们会发现,此时我们的需要正好和SOCKET中对于不同协议数据的处理所提出的要求不谋而合。
    那么我们就来看看如何在SOCKET中使用观察者模式,以下给出了核心代码:
using System.Collections;
using System.Collections.Generic;
public delegate void OnActionHander(byte[] buffer);
public class EventDispatcher : SingleTon<EventDispatcher> {
    private Dictionary<ushort, List<OnActionHander>> dic = new Dictionary<ushort, List<OnActionHander>>();   
    /// 添加监听   
    public void AddEventListener(ushort protoCode,OnActionHander handler)
    {
        if (dic.ContainsKey(protoCode))
        {
            dic[protoCode].Add(handler);
        }
        else
        {
            List<OnActionHander> lstHandler = new List<OnActionHander>();
            lstHandler.Add(handler);
            dic[protoCode] = lstHandler;
        }
    }    
    /// 移除事件
    public void RemoveEventListener(ushort protoCode,OnActionHander handler)
    {
        List<OnActionHander> lstHandler=dic[protoCode];
        lstHandler.Remove(handler);
        if (lstHandler.Count == 0)
        {
            dic.Remove(protoCode);
        }
    }
    /// 派发协议
    public void Dispatch(ushort protoCode,byte[] buffer)
    {
        if (dic.ContainsKey(protoCode))
        {
            List<OnActionHander> lstHandler=dic[protoCode];
            if (lstHandler != null && lstHandler.Count > 0)
            {
                for (int i = 0; i < lstHandler.Count; i++)
                {
                    if (lstHandler[i] != null)
                    {
                        lstHandler[i](buffer);
                    }
                }
            }
        }
    }
}
这样就可以实现对网络中传入数据的监听。


阅读全文
0 0
原创粉丝点击