浅谈面向对象设计模式:观察者模式
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);
}
}
}
}
}
}
这个代码实际上是一个委托管理类,它包含了添加侦听者,移除侦听者,派发事件等方法。这样假如我们实现一个群聊的功能,服务器本身是被观察者,而每个客户端都是观察者,当一个客户端发来消息时,服务器派发事件,通知所有的客户端类,给他们发送消息。这就是观察者模式。
观察者模式(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);
}
}
}
}
}
}
这个代码实际上是一个委托管理类,它包含了添加侦听者,移除侦听者,派发事件等方法。这样假如我们实现一个群聊的功能,服务器本身是被观察者,而每个客户端都是观察者,当一个客户端发来消息时,服务器派发事件,通知所有的客户端类,给他们发送消息。这就是观察者模式。
相关文章推荐
- 面向对象程序设计(OOP设计模式)-行为型模式之观察者模式的应用与实现
- 面向对象的设计模式(七),观察者模式
- [导入]C#面向对象设计模式纵横谈(19):(行为型模式) Observer 观察者模式.zip(10.27 MB)
- 面向对象设计模式之---观察者模式(Observer Pattern)
- 面向对象设计模式之一观察者模式
- PHP面向对象深入理解之四(设计模式-观察者模式)
- C#面向对象模式设计第二十四讲:Visitor 观察者模式(行为型模式)
- C#面向对象模式设计第十九讲:Observer 观察者模式(行为型模式)
- 面向对象设计模式--观察者模式(Observer)
- 第一章 引言--《设计模式-可复用面向对象软件的基础》Erich Gamma
- 设计模式_面向对象设计原则简述
- 设计模式学习笔记二:面向对象基础二
- 关于面向对象和观察者模式
- 20180320 java java面向对象-单例设计模式
- [导入]C#面向对象设计模式纵横谈(21):(行为型模式) Memento 备忘录模式.zip(9.73 MB)
- 编程语言入门及进阶、设计模式、面向对象书籍
- 面向对象设计模式与原则 【转载】
- JavaScript面向对象设计二 构造函数模式
- 设计模式必须通过面向对象来实现吗?
- 设计模式-面向对象设计原则