观察者模式是我们在面向对象编程中的一个很常见的设计模式。
观察者模式(Observer)完美的将观察者和被观察的对象分离开,在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。
观察者设计模式定义了对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。
例如我们开发服务器时,经常会用到观察者模式,玩家信息同步、聊天室等功能的实现,通过观察者模式可以使代码结构清晰,复用、扩展更加容易。
下面为大家分享一下关于服务器观察者模式的例子:
using GameServer;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
public class EventDispatcher : Singleton<EventDispatcher>
{
/// <summary>
/// 委托原型
/// </summary>
/// <param name="role">客户端类</param>
/// <param name="buffer">消息数组</param>
public delegate void OnActionHandler(Role role, byte[] buffer);
/// <summary>
/// 委托字典
/// </summary>
/// <param name="ushort">协议编号</param>
/// <param name="handler">对应委托</param>
private Dictionary<ushort, List<OnActionHandler>> dic =
new Dictionary<ushort, List<OnActionHandler>>();
/// <summary>
/// 添加侦听者
/// </summary>
/// <param name="protoCode">协议编号</param>
/// <param name="handler">对应委托</param>
public void AddEventListener(ushort protoCode, OnActionHandler handler)
{
if (dic.ContainsKey(protoCode))
{
dic[protoCode].Add(handler);
}
else
{
List<OnActionHandler> lsthandler = new List<OnActionHandler>();
lsthandler.Add(handler);
dic[protoCode] = lsthandler;
}
}
/// <summary>
/// 移除侦听者
/// </summary>
/// <param name="protoCode">协议编号</param>
/// <param name="handler">对应委托</param>
public void RemoveEventListener(ushort protoCode, OnActionHandler handler)
{
if (dic.ContainsKey(protoCode))
{
List<OnActionHandler> lsthandler = dic[protoCode];
lsthandler.Remove(handler);
if (lsthandler.Count == 0)
{
dic.Remove(protoCode);
}
}
}
/// <summary>
/// 派发
/// </summary>
/// <param name="protoCode">协议编号</param>
/// <param name="param">消息数组</param>
public void Dispatch(ushort protoCode, Role role, byte[] buffer)
{
if (dic.ContainsKey(protoCode))
{
List<OnActionHandler> lsthandler = dic[protoCode];
if (lsthandler != null && lsthandler.Count > 0)
{
for (int i = 0; i < lsthandler.Count; i++)
{
if (lsthandler[i] != null)
{
lsthandler[i](role, buffer);
}
}
}
}
}
}
这个代码实际上是一个委托管理类,它包含了添加侦听者,移除侦听者,派发事件等方法。这样假如我们实现一个群聊的功能,服务器本身是被观察者,而每个客户端都是观察者,当一个客户端发来消息时,服务器派发事件,通知所有的客户端类,给他们发送消息。这就是观察者模式。