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
- Unity如何实现网络通讯(三):观察者模式以及在网络模块的应用
- Unity网络通讯的一些理解——观察者模式
- Unity如何实现网络通讯(一):HTTP
- Unity如何实现网络通讯(二):SOCKET
- 观察者模式的优缺点以及使用场景(三)
- Unity中设计模式应用(二):结合中介者模式的观察者模式
- 实现观察者与被观察者设计模式在事件处理上的应用
- 三种观察者模式的C#实现
- 观察者模式-在wsnos中的应用以及拓展
- 观察者模式-气象台的实现与应用
- 观察者模式的Java实现及应用
- 观察者模式的Java实现及应用
- 【 应用以及剖析】之 java.util.Observer 观察者模式实现
- 观察者(Observer)模式在Android应用
- 设计模式-观察者模式,以及如何使用观察者来为app实现即时通讯功能
- 观察者模式的应用
- 观察者模式的应用
- 观察者模式的应用
- Spring+SpringMVC+Hibernate整合注解版
- [NOIP2017模拟]鱼群分裂
- 对UX设计5年内发展的5项预测
- 测井录井
- 对 left join 多个表的join 和 on 的分析Demo
- Unity如何实现网络通讯(三):观察者模式以及在网络模块的应用
- C#中的原子操作Interlocked你真的了解吗?
- (三) ElasticSearch基础知识
- C#--Winform项目核心--考勤模块(二)
- Comparable和Comparator接口
- MyBatis和Hibernate相比,优势在哪里?
- linux mysql 乱码问题
- Solaris命令行安装Oracle Solaris Studio报错
- 菜鸟篇--手把手教你制作机器人