2016-09-24 1 views
0

Ich habe wirklich Probleme, ein Designmuster für einen Alerter zu entwickeln, den ich baue. Hier ist ein künstliches Beispiel von dem, was ich versuche zu tun:Welches Designmuster für einen Alerter?

Eine Person möchte eine Warnung nach Wettertyp (Regen, Schnee, Sonne, etc.) bekommen. Eine Person hat auch eine Auswahl an Alarm-Methode (E-Mail, SMS, Slack-Kanal, Hip-Chat-Raum, etc.)

Ich muss: eine Klasse haben, die in einem Wettertyp dauert. Dann ruft es alle Leute ab, die sich für diesen Wettertyp interessieren. Anschließend durchläuft es alle Personen und sendet ihnen eine Warnung (basierend auf der Voreinstellung der Person für den Alarmtyp).

Hier ist meine Grundzüge, aber es scheint, wie es "besser" getan werden sollte:

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; 
      } 
     } 
    } 
} 
+0

Wenn Sie einen Algorithmus oder ein Entwurfsmuster wahrscheinlich diskutieren müssen, sollten Sie die Frage an programmers.stackexchange.com schicken – Steve

+2

@Steve, wenn Sie andere Sites verweisen, ist es oft hilfreich, das [Cross-Posting ist verpönt] (http://meta.stackexchange.com/tags/cross-posting/info) – gnat

+0

@gnat absolut korrekt, meine Schuld hier, aber ich war so von einem Meta-Post auf Programmierer, die ich gesehen habe weggenommen habe komplett vergessen – Steve

Antwort

1

Sie können generics

wie folgt verwenden:

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); 
     } 
    } 
} 

Sie auch ersetzen können der Wettertyp mit einem anderen generischen.

+0

Nicht bekommen Sie stecken Sie eine große switch-Anweisung, basierend auf der Art der Warnung (E-Mail, SMS, etc.), die gefeuert werden muss? – Matt

1

Das klingt wie eine Veröffentlichung & abonnieren Muster. Es gibt eine Reihe von Möglichkeiten, um das Muster zu implementieren, hier ist ein Link zu beginnen (aber sicherlich einen Blick auf andere nehmen, bevor Sie entscheiden, welche für Sie am besten funktioniert): https://msdn.microsoft.com/en-us/library/ms752254(v=vs.110).aspx

Sie könnten möglicherweise Paar es mit ein Event-Aggregator - https://msdn.microsoft.com/en-us/library/ff921122.aspx

+0

Sie könnten Recht haben, aber ich bin mir nicht sicher, wie ich meinen Code oben in ihn anpassen soll - ist es nicht schon eine Art der Veröffentlichung für die Abonnenten? – Matt

+0

Ja, es scheint zu Ihrer Liste der Abonnenten zu veröffentlichen. Aber um das Muster zu vervollständigen, können Sie Event-Anhebung/-Hören getrennt von Ihrem aktuellen Alerter einbeziehen. Hier ist ein Beispiel, das ich mit mehr Details gefunden habe: http://www.codeproject.com/Articles/866547/Publisher-Subscriber-pattern-with-Event-Delegate-a –