您的位置:首页 > 其它

浅谈面向对象设计模式:观察者模式

2017-10-14 16:30 471 查看
       观察者模式是我们在面向对象编程中的一个很常见的设计模式。

 
观察者模式(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);
                    }
                }
            }
        }
    }

}

  这个代码实际上是一个委托管理类,它包含了添加侦听者,移除侦听者,派发事件等方法。这样假如我们实现一个群聊的功能,服务器本身是被观察者,而每个客户端都是观察者,当一个客户端发来消息时,服务器派发事件,通知所有的客户端类,给他们发送消息。这就是观察者模式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息