使用C#的计时器加观察者模式完成报警推送需求
2021-03-18 23:24
标签:需求分析 结果 date 冗余代码 send 领导 提高 move result 这两天面试了一个物联网公司高级研发,面试题是下面这样子 公司领导,部门主管,小组组长,组成员4级,假如有个 疫情预警,先通知组人员(对个人,主要有一个处理就算处理了) 如果3分钟没处理,就往组长发短信,如果组长3分钟没处理就往上级推送。一级一级的。 要求单程序并发至少支持1000tps预警事件 说实话上面需求在我做的过往项目里有过类似需求,我也只是依稀记得自己是怎么做的。类似于使用第三方任务调度框架完成上面的3分钟超时处理,然后至于分级发送则更简单了,再不济就是使用if、else这样的最原始验证即可。但是这样的题目丢到面试题上我是一下就不知所措了。自然最终的结果也不尽人意(我最终提交的代码就是采用一个事件总线实现报警的推送,但是并未对其进行超时分级发送) 这个自然是错误的,我其实当时也想过使用Timer,但是内心对Timer就是感觉用性能做代价去换取最终的结果。 过了几天还是觉得要手纯撸代码将上面功能撸出来,不然如何成长呢! 通过上面的需求分析可以知道我们必须要定义一个枚举,记录职称高低。 其次我们至少存在两个类,一个是产生报警的对象,这个对象有需要通知的报警信息和报警信息发送结果,当然更加少不了我们订阅了报警消息的订阅者。这里想了下,可以采用观察者设计模式进行解耦。 接下来就是实现上面接口了! 还需要有订阅者,订阅者使用抽象类方式降低耦合性(其实还是要用事件总线,将耦合性和扩展性提高一个档次) 再加个子类,重写下接收警报的方法 最终我的main方法是这样 调试的效果如下: 明天还是完善下,将使用EventBus,将耦合性再度降低,同时也能让接收方法更加灵活性,能实现不同级别的职员做出不同的响应! 使用C#的计时器加观察者模式完成报警推送需求 标签:需求分析 结果 date 冗余代码 send 领导 提高 move result 原文地址:https://www.cnblogs.com/hunanzp/p/12343863.html前言
解析需求
拆分下需求可以得到的消息是有一个事件。这个事件就是报警事件,通过报警事件需要将消息推送给不同职位的工作人员,而且必须遵循岗位从下至上,但凡人员收到报警消息则表示报警通知已完成,其次就是有一个三分钟需要处理。 ///
///
///
///
public class SubscriberPeople : SubscriberPeopleBase
{
public SubscriberPeople(JobLevel title) : base(title) { }
public override bool ReceiveData(Baojing baojing)
{
if (Title == JobLevel.公司领导)
{
Console.WriteLine($"出现最新报警信息:{baojing.Msg},当前订阅者:{Title.ToString()} 已成功应答 {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}");
return true;
}
else
{
Console.WriteLine($"出现报警信息:{baojing.Msg},当前订阅者:{Title.ToString()},默认未应答 {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}");
return false;
}
}
}
static void Main(string[] args)
{
IPublish publish = new Baojing();
publish.AddSubscriber(new SubscriberPeople(JobLevel.组成员));
publish.AddSubscriber(new SubscriberPeople(JobLevel.公司领导));
publish.AddSubscriber(new SubscriberPeople(JobLevel.部门主管));
publish.AddSubscriber(new SubscriberPeople(JobLevel.小组组长));
publish.CreateJB("主机温度过高!");
publish.SendNotify();
Console.ReadLine();
}