using System;
using System.Collections.Generic;
using System.Diagnostics;
namespace Bro.Common.PubSub
{
///
/// 简单发布/订阅中心
///
public class SimplePubSubCenter : IPubSubCenter
{
///
/// 订阅主题和订阅者
///
private Dictionary subMap = new Dictionary();
///
/// 订阅事件
///
///
///
///
public bool Subscribe(string tag, Func method)
{
var sub = new SimpleSubscriber();
// 默认使用hash值设置名称,防止重复
sub.SubscriberName = sub.GetHashCode().ToString();
sub.SubMethod = method;
return Subscribe(tag, sub);
}
///
/// 订阅事件
///
///
///
///
public bool Subscribe(string tag, ISubscriber subscribe)
{
if ( null == tag || null == subscribe )
{
return false;
}
if ( subMap.ContainsKey(tag) )
{
var subs = subMap[tag];
return subs.Add(subscribe);
}
else
{
var subs = new Subscribers();
if ( !subs.Add(subscribe) )
{
return false;
}
subMap.Add(tag, subs);
return true;
}
}
///
/// 发布事件
///
///
///
public void Publish(string tag, object param1, object param2)
{
if ( null == tag )
{
return;
}
// 获取所有tag订阅者
var subs = GetSubscribers(tag);
if ( null == subs )
{
return;
}
var enmtor = subs.GetEnumerator();
if ( null == enmtor )
{
return;
}
// 通知所有订阅者事件
while(enmtor.MoveNext())
{
var cur = enmtor.Current;
if ( null == cur || null == cur.SubMethod)
{
continue;
}
cur.SubMethod(cur, param1, param2);
}
}
///
/// 获取所有订阅者
///
///
///
public Subscribers GetSubscribers(string tag)
{
if ( !subMap.ContainsKey(tag) )
{
return null;
}
return subMap[tag];
}
///
/// 获取某个订阅者
///
///
///
///
public ISubscriber GetSubscriber(string tag, string name)
{
var subs = GetSubscribers(tag);
if ( null == subs )
{
return null;
}
return subs.GetSubscriber(name);
}
///
/// 移除某个订阅者
///
///
///
///
public bool RemoveSubscriber(string tag, string name)
{
var subs = GetSubscribers(tag);
if ( null == subs )
{
return false;
}
if ( !subs.Rmv(name) )
{
return false;
}
if ( subs.GetCount() == 0 )
{
subMap.Remove(tag);
}
return true;
}
///
/// 移除订阅
///
///
///
///
public bool RemoveSubscriber(string tag, Func method)
{
var subs = GetSubscribers(tag);
if ( null == subs )
{
return false;
}
if ( !subs.Rmv(method) )
{
return false;
}
if ( subs.GetCount() == 0 )
{
subMap.Remove(tag);
}
return true;
}
///
/// 移除某类所有订阅者
///
///
///
public bool RemoveSubscribers(string tag)
{
var subs = GetSubscribers(tag);
if ( null == subs )
{
return false;
}
subMap.Remove(tag);
return true;
}
//IEnumerable