服务的功能:这个服务就是能够实现多通路报警的服务,比如邮件报警、客户端报警、短信报警等,该服务灵活性还不错,比较方便扩展
着重说一下策略模式。首先需要定义一个接口,该接口用来统一报警方法,代码如下:
///
/// 报警接口,统一各种报警方式发出报警的方法
///
public interface IAlarm
{
void Alarm(Message message);
}
大家伙看到Message会不会比较疑惑呢,别着急,Message就是我自己定义的一个报警的模型,比如报警标题,收件人(报警报给谁呢),报警方式(邮件、客户端等)等。
定义好接口之后,我们就要实现这个接口,实现这个接口的就是各种报警方式的类,比如EmailAlarm.cs和ClientAlarm.cs,下面是邮件报警的具体实现,EmailAlarm.cs的代码(需要实现IAlarm接口的Alarm方法):
///
/// 邮件报警
///
public class EmailAlarm : IAlarm
{
///
/// 发送邮件实现了IAlarm接口的Alarm()方法
///
///
public void Alarm(Message message)
{
// 此处为邮件报警的具体实现代码
}
}
下面是客户端报警的具体实现,ClientAlarm.cs(同样需要实现IAlarm接口的Alarm()方法)
///
/// 客户端报警
///
public class ClientAlarm : IAlarm
{
///
/// 实现接口IAlarm接口的Alarm()方法
///
public void Alarm(Message message)
{
//此处为客户端实现报警的具体代码
}
}
好了,基础工作都做完,接下来我们面临的问题是我们该如何调用不同的报警实现呢?当然,在我们的报警模型Message中有报警方式这一字段,我们需要根据报警方式这个字段来发不同的报警。这个还不简单,我们根据不同的报警方式生成不同的对象,然后各自调用Alarm()方法就ok。当然,这是一种解决方法,但是这是最好的解决方法吗?of course not!听说过反射吗,小伙伴们?接下来,我将介绍如何利用反射来调用不同的报警方式:
///
/// 统一发出各种报警的类,将所有调用报警的操作封装在这个类中,主程序需要报警时,直接调用这个类就可以,无需知道其他任何类的存在
///
public class AlarmContext
{
private static readonly IDictionary
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);
}
}
}
///
/// 通过发射,调用不同的报警方式
///
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)
{
//记录错误日志
}
}
}
}
}
以上就是使用策略模式实现报警服务示例详解(短信报警)的详细内容,更多请关注0133技术站其它相关文章!