警报器的设计模式

时间:2016-09-24 09:33:15

标签: c# design-patterns

我真的很难为我正在构建的Alerter提出设计模式。这是我正在尝试做的一个人为的例子:

一个人想要根据天气类型(雨,雪,太阳等)发出警报。一个人也可以选择警报方法(电子邮件,短信,闲聊频道,聊天室等)。

我需要:拥有一个吸收天气类型的课程。然后它检索所有关心该天气类型的人。然后它遍历所有人并向他们发送警报(基于人的警报类型偏好)。

这是我的基本大纲,但似乎应该做得更好“

public class Alerter
{
    private readonly WeatherType _weatherType;

    public Alerter(WeatherType weatherType)
    {
        _weatherType = weatherType;
    }

    public void SendAlerts()
    {
        var people = PersonRepository.GetPeople(_weatherType);

        foreach (Person person in people)
        {
            switch (person.AlertType)
            {
                case Email:
                    var e = new EmailAlerter();
                    e.SendToPerson(person, _weatherType);
                    return;
                case SMS:
                    var s = new SmsAlerter();
                    s.SendToPerson(person, _weatherType);
                    return;
            }
        }
    }
}

2 个答案:

答案 0 :(得分:1)

您可以使用generics

像这样:

public class Alerter<T>
{
    private readonly WeatherType _weatherType;

    public Alerter(WeatherType weatherType)
    {
        _weatherType = weatherType;
    }

    public void SendAlerts()
    {
        var people = PersonRepository.GetPeople(_weatherType);

        foreach (Person person in people)
        {
            var e = (T)Activator.CreateInstance(typeof(T));
            e.SendToPerson(person, _weatherType);
        }
    }
}

您也可以将天气类型替换为其他通用类型。

答案 1 :(得分:1)

这听起来像是一个发布&amp;订阅模式。有很多方法可以实现上述模式,这里有一个启动你的链接(但在你决定哪个最适合你之前一定要看看别人): https://msdn.microsoft.com/en-us/library/ms752254(v=vs.110).aspx

您可以将其与事件聚合器 - https://msdn.microsoft.com/en-us/library/ff921122.aspx

结合使用