设计模式落地实战 | 观察者模式 | 功能性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群每个成分不同,跨度十分大,所需要的功能没有太多相似性,基本都需要重写套独立的业务处理
且所有的群消息处理都需要同时响应,没有先后(什么踏马叫公平!),所以采用了观察者模式进行封装
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?