首页 > 其他分享 >设计模式落地实战 | 观察者模式 | 功能性QQ机器人封装思路

设计模式落地实战 | 观察者模式 | 功能性QQ机器人封装思路

时间:2023-02-02 13:23:01浏览次数:69  
标签:QQ GroupEvent 封装 observer void class observers 设计模式 public

 情况简介

对接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 one rror(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群每个成分不同,跨度十分大,所需要的功能没有太多相似性,基本都需要重写套独立的业务处理

且所有的群消息处理都需要同时响应,没有先后(什么踏马叫公平!),所以采用了观察者模式进行封装


 

参考来源(复制来源

 

标签:QQ,GroupEvent,封装,observer,void,class,observers,设计模式,public
From: https://www.cnblogs.com/ncellit/p/17085697.html

相关文章

  • js-设计模式-行为型-策略模式与状态模式的区别
    在js行为型设计模式中。策略模式与状态模式大同小异。下面,来说说它的区别。相同点:都会使用行为函数封装行为,通过委托来分发行为。不同点:策略模式中的行为函数会更加割裂,......
  • Java—成员变量与局部变量、封装
    一、成员变量与局部变量1.定义的位置不同成员变量:成员变量定义在方法外,类中;局部变量:局部变量定义在方法中。2.生命周期不同成员变......
  • C++ Day11 使用单例模式封装log4cpp
    一、实现log4cpp的封装,使其可以像printf一样使用,测试用例如下: 思路:使用可变模板参数,最终达到的效果是在使用 LogInfo、LogError、LogWarn、LogDebug时候可以传递任意类......
  • 客服系统即时通讯IM开发(六)Glang Gorm 执行原生Sql语句增删改查封装库【唯一客服】网站
    在开发在线客服系统的时候,有某些地方需要使用脚本去批量执行SQL语句,这个时候就需要使用简单的执行SQL的封装函数了查询操作是使用的原生的sql库,没用Gorm,原因是Gorm的RawS......
  • php 3种常见设计模式
    1、工厂模式<?phpnamespaceFacebab;classFactory{staticfunctioncreateDatabase(){returnnewDatabase();}}$db=Facebab\Factory::createDatabas......
  • 设计模式-Simple Factory(简单工厂)
    模式说明简单工厂模式又叫静态工厂模式,但不属于23种设计模式。简单工厂模式是由一个工厂对象决定创建出哪一个产品类的实例。UML结构图优点实现了对责任的分割,隔离了......
  • TS 封装 Axios
    前言Axios的二次封装是一项基础工作,主要目的就是将一些常用的功能进行封装,简化后续网络请求的发送。JS版本的封装大家都已经非常熟悉了,可以信手拈来。但是使用 TypeSc......
  • Hibernate 自动进行数据封装
    1.前言Hibernate可以构建各种复杂的SQL语句,但其本质都是反射机制结合映射关系完成的。框架也仅是一款程序产品,人为编写的产物。要相信,只要你愿意,你完全可以实现自己的......
  • 设计模式 > 单一职责原则
    SOLID原则并非单纯的1个原则,而是由5个设计原则组成的,它们分别是单一职责原则,开闭原则,里氏替换原则,接口隔离原则和依赖反转原则。单一职责原则(SRP)定义:一个类或者模块只负......
  • 使用vant、promise封装回调、全局状态共享、分包
    应用的生命周期onLaunch:启动应用时调用onShow:显示时调用,可能调用多次onHide:隐藏时调用(进入到后台),可能调用多次onError:整个应用如果某个部分有报错就调用页面的......