情況簡介
對接qq機器人,使用.Net sdk,不同羣消息不同處理方式,但羣消息事件要同時下發執行,各個羣之間不分前後
開始封裝
定義一個羣消息事件的數據類,存儲要下發的數據
public class GroupEvent { public GroupMessageReceiver? groupMessageReceiver { get; set; }//羣消息事件 public RconClient? rconClient { get; set; }//用於Minecraft服務器的rcon接口 }
定義發佈
public class GroupDataPublisher : IObservable<GroupEvent> { List<IObserver<GroupEvent>> observers = new List<IObserver<GroupEvent>>(); /// <summary> /// 訂閱主題,將觀察者添加到列表中 /// </summary> /// <param name="observer"></param> /// <returns></returns> public IDisposable Subscribe(IObserver<GroupEvent> observer) { observers.Add(observer); return new Unsubscribe(this.observers, observer); } /// <summary> /// 取消訂閱類 /// </summary> private class Unsubscribe : IDisposable { List<IObserver<GroupEvent>> observers; IObserver<GroupEvent> observer; public Unsubscribe(List<IObserver<GroupEvent>> observers , IObserver<GroupEvent> observer) { this.observer = observer; this.observers = observers; } public void Dispose() { if (this.observers != null) { this.observers.Remove(observer); } } } /// <summary> /// 通知已訂閱的觀察者 /// </summary> /// <param name="weatherData"></param> private void Notify(GroupEvent weatherData) { foreach (var observer in observers) { observer.OnNext(weatherData); } } /// <summary> /// 接收最新羣數據 /// </summary> /// <param name="weatherData"></param> public void ReciveNewData(GroupEvent weatherData) { Notify(weatherData); } }
定義羣處理抽象
/// <summary> /// 羣處理抽象 /// </summary> public abstract class GroupHandleBase : IObserver<GroupEvent> { public virtual void OnCompleted() { } public virtual void OnError(Exception error) { } public abstract void OnNext(GroupEvent value); }
消費端
public class BlogCoreGroup : GroupHandleBase { public override async void OnNext(GroupEvent e){ //寫上對應處理 } }
最終使用
GroupDataPublisher publisher = new GroupDataPublisher(); //訂閱 var blogCoreGroup = new BlogCoreGroup(); publisher.Subscribe(blogCoreGroup); // 如此照貓畫虎,多一個羣就新建個消費端類處理
總結
因爲本人涉及圈子廣泛,所處的QQ羣每個成分不同,跨度十分大,所需要的功能沒有太多相似性,基本都需要重寫套獨立的業務處理
且所有的羣消息處理都需要同時響應,沒有先後(什麼踏馬叫公平!),所以採用了觀察者模式進行封裝