具有多个传递通道的通知系统最合适的设计模式是什么?

时间:2017-11-08 23:17:39

标签: c# design-patterns notifications factory-pattern open-closed-principle

我正在处理学生信息,我希望根据某些系统事件发送通知。例如,当学生被标记为迟到或缺席时,应用程序将通知用户列表(父母,学校管理员等)。此通知将使用所有可用方法(SMS,电子邮件)发送以传递消息。每种方法都负责根据约束格式化通知。

以下是将生成通知的一些事件的列表:

  • 分配标记缺失
  • 平均降幅低于合格成绩
  • 学生获得荣誉榜
  • 一个月的完美出席率

我希望使用短信和电子邮件发送消息/通知。将来,我希望能够在不违反开/关原则的情况下添加新的交付方式。

类似问题similar question,但没有提及实现此系统的设计模式。我也调查了this question,但我的问题是每个发送方法都需要发送自定义消息。

如何实施此系统,以便我可以添加新的交付方式,并让每种交付方法根据其功能格式化通知/消息?这种情况最适用的设计模式是什么? 我是否需要使用工厂模式为所有通知机制创建消息?

这是我到目前为止所拥有的......

 public class NotificationEmailMessage 
{
    public string ToEmail { get; set; }
    public string Subject { get; set; }
    public string Body { get; set; }
}

public class NotificationSMSMessage  
{
    public string PhoneNumber { get; set; }
    public string Message { get; set; }
}

public interface INotificationSender
{
    void Send();
}

public class NotificationEmailSender : INotificationSender
{
    public void Send()
    {
        System.Diagnostics.Debug.Write("Sending Email");
    }
}

public class NotificationSMSSender : INotificationSender
{
    public void Send()
    {
        System.Diagnostics.Debug.Write("Sending SMS");
    }
}

public class NotificationMultiSender : INotificationSender
{
    public List<INotificationSender> _senders;

    public NotificationMultiSender()
    {
        _senders = new List<INotificationSender>();
    }

    public void Send()
    {
        _senders.ForEach(sender => sender.Send());
    }

    public void AddSender(INotificationSender sender)
    {

    }
}

2 个答案:

答案 0 :(得分:1)

我想到的是Observer Pattern。希望有所帮助。

编辑: 您可以将发送的消息与确定应发送哪些消息的逻辑分开。为了提供我正在谈论的更具体的示例,请尝试在发送消息时触发事件。然后,您可以为每种邮件发送类型添加事件订阅者。确定何时需要发送消息的代码永远不需要更改,每次添加新类型时,只需添加新订阅者。

答案 1 :(得分:0)

在这里我将使用装饰器模式,它增加了很多与用户设置相关的灵活性,您可以发送电子邮件短信电报,因此每个发件人单独的装饰器也很容易在未来添加新的发件人,只需使用 send 方法实现装饰器接口