設計模式落地實戰 | 觀察者模式 | 功能性QQ機器人封裝思路

 情況簡介

對接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羣每個成分不同,跨度十分大,所需要的功能沒有太多相似性,基本都需要重寫套獨立的業務處理

且所有的羣消息處理都需要同時響應,沒有先後(什麼踏馬叫公平!),所以採用了觀察者模式進行封裝


 

參考來源(複製來源

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章