时间:2021-05-19
着重说一下策略模式。首先需要定义一个接口,该接口用来统一报警方法,代码如下:
复制代码 代码如下:
/// <summary>
/// 报警接口,统一各种报警方式发出报警的方法
/// </summary>
public interface IAlarm
{
void Alarm(Message message);
}
大家伙看到Message会不会比较疑惑呢,别着急,Message就是我自己定义的一个报警的模型,比如报警标题,收件人(报警报给谁呢),报警方式(邮件、客户端等)等。
定义好接口之后,我们就要实现这个接口,实现这个接口的就是各种报警方式的类,比如EmailAlarm.cs和ClientAlarm.cs,下面是邮件报警的具体实现,EmailAlarm.cs的代码(需要实现IAlarm接口的Alarm方法):
复制代码 代码如下:
/// <summary>
/// 邮件报警
/// </summary>
public class EmailAlarm : IAlarm
{
/// <summary>
/// 发送邮件实现了IAlarm接口的Alarm()方法
/// </summary>
/// <param name="messag"></param>
public void Alarm(Message message)
{
// 此处为邮件报警的具体实现代码
}
}
下面是客户端报警的具体实现,ClientAlarm.cs(同样需要实现IAlarm接口的Alarm()方法)
复制代码 代码如下:
/// <summary>
/// 客户端报警
/// </summary>
public class ClientAlarm : IAlarm
{
/// <summary>
/// 实现接口IAlarm接口的Alarm()方法
/// </summary>
public void Alarm(Message message)
{
//此处为客户端实现报警的具体代码
}
}
好了,基础工作都做完,接下来我们面临的问题是我们该如何调用不同的报警实现呢?当然,在我们的报警模型Message中有报警方式这一字段,我们需要根据报警方式这个字段来发不同的报警。这个还不简单,我们根据不同的报警方式生成不同的对象,然后各自调用Alarm()方法就ok。当然,这是一种解决方法,但是这是最好的解决方法吗?of course not!听说过反射吗,小伙伴们?接下来,我将介绍如何利用反射来调用不同的报警方式:
复制代码 代码如下:
/// <summary>
/// 统一发出各种报警的类,将所有调用报警的操作封装在这个类中,主程序需要报警时,直接调用这个类就可以,无需知道其他任何类的存在
/// </summary>
public class AlarmContext
{
private static readonly IDictionary<AlarmWay,IAlarm> _alarmsDic = new Dictionary<AlarmWay, IAlarm>();
static AlarmContext()
{
foreach (AlarmWay way in Enum.GetValues(typeof (AlarmWay)))
{
try
{
Assembly asm = Assembly.GetExecutingAssembly();
Object obj = asm.CreateInstance("MOPlatform.Alert." + way + "Alarm", true);
IAlarm alarm = obj as IAlarm;
_alarmsDic[way] = alarm;
}
catch (Exception ex)
{
Logger.Error("通过反射构造报警实例时出现异常:" + ex);
}
}
}
/// <summary>
/// 通过发射,调用不同的报警方式
/// </summary>
public void HandleMessage(Message message)
{
foreach (AlarmWay way in Enum.GetValues(typeof(AlarmWay)))
{
//遍历所有的报警方式,每一种报警方式与message.AlarmWays进行按位与运算,如果运算结果仍然为当前遍历的报警方式,则说明Message中包含这种报警方式
if ((message.AlramWays & way) == way)
{
try
{
_alarmsDic[way].Alarm(message);
}
catch (Exception ex)
{
//记录错误日志
}
}
}
}
}
看到AlarmWay是不是又混乱了呢?千万别乱,AlarmWay就是我定义的一个枚举类型,里面包含了各种报警方式,具体的代码我会在文章的最后贴出。我们现在还是着重讨论上面的代码,亲爱的小伙伴们,看到上面的静态构造函数了吗?知道为什么要这样写吗?我们在静态构造函数中利用反射将枚举中所有的报警对象保存在IDictionary中,具体的保存如_alarmsDic['Email'] = (IAlarm)EmailAlarm。这样做的好处小伙伴们自己琢磨吧,嘻嘻。
最后就是我们在主程序中调用AlarmContext来发出报警,具体的调用代码如下:
复制代码 代码如下:
class Program
{
static void Main(string[] args)
{
Console.WriteLine("报警服务已启动。。。");
//message应该是从别的程序传递过来的需要报警的消息,比如在Redis队列中获取message,具体怎么获取根据需求而定。在这里为了方便,我新生成一个对象,其实不应该这样做
Message message = new Message();
AlarmContext context = new AlarmContext();
context.HandleMessage(message);
}
}
OK,到此为止,利用策略模式设计的报警服务就介绍完毕啦。这篇文章的主要知识点我认为有两个,一个是策略模式,另一个就是利用反射。希望广大的小伙伴们提出宝贵的意见,最后,贴出枚举AlarmWay的代码:
复制代码 代码如下:
/// <summary>
/// 报警方式
/// </summary>
public enum AlarmWay
{
Email = 1,
Client = 2,
ShortMessage = 4
}
顺便,小伙伴们思考一下为什么ShortMessage的值是4而不是3呢?
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
日常运维工作中,通常是邮件报警机制,但邮件可能不被及时查看,导致问题出现得不到及时有效处理。所以想到用Python实现发短信功能,当监控到问题出现时,短信报警,
1月29日消息,据“永济公安”微信公号,1月28日19时40分,山西永济市公安局110报警服务台接群众报警称在永济市百货大楼一楼大厅,有
你可在监控服务中为账户所有的容器、服务和RDS实例创建并配置状态维度报警和事件报警,推送到指定手机和邮箱。监控首页展示已配置的报警列表,包含报警名称、报警针对的
本章所讲内容:1、钉钉报警设置2、钉钉报警脚本运行。1、钉钉报警设置钉钉,关于webhook的报警需求,钉钉报警也是我们在公司中常见的报警系统,在这里主要是结合
本文实例讲述了nodejs实现发出蜂鸣声音(系统报警声)的方法。分享给大家供大家参考,具体如下:nodejs有时候需要发出报警声音,使用以下代码可以调用系统蜂鸣