2016-09-24 83 views
0

我真的很努力想出一個我正在構建的警報器的設計模式。下面是我試圖做的一個人爲的例子:警報器的設計模式

一個人想要通過天氣類型(雨,雪,太陽等)獲得警報。一個人也可以選擇警報方式(電子郵件,短信,閒暇頻道,時尚聊天室等)

我需要:有一個課程需要天氣類型。然後它檢索所有關心該天氣類型的人。然後它循環遍歷所有人並向他們發送警報(基於人的警報類型首選項)。

這裏是我的基本輪廓,但看起來它應該做的 「更好」:

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

如果你需要討論一個算法或設計模式,你可能應該把問題發佈給程序員.stackexchange.com – Steve

+2

@Steve在引用其他網站時,指出[交叉發佈是皺眉了](http://meta.stackexchange.com/tags/cross-posting/info) – gnat

+0

@gnat絕對正確,我的錯在這裏,但我是如此從程序員看到的一個meta post被拿走,我已經完全忘記 – Steve

回答

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

您也可以替換與其他通用類型的天氣類型。

+0

難道你沒有得到基於需要被解僱的警報類型(電子郵件,短信等),堅持做一個大的switch語句? – Matt

1

這聽起來像是發佈&訂閱模式。有許多方式可以實現所說的模式,這裏有一個鏈接到您開始使用(當然你決定哪個最適合你之前,先看看其他人): https://msdn.microsoft.com/en-us/library/ms752254(v=vs.110).aspx

你可能對夫婦它與一個事件聚合器 - https://msdn.microsoft.com/en-us/library/ff921122.aspx

+0

你可能是對的,但我不確定如何修改上面的代碼 - 是不是已經發布給訂閱者? – Matt

+0

是的,它似乎確實正在發佈到您的訂戶列表。但要完成這種模式,您可能希望將事件提升/收聽與您當前的提醒器分開。以下是我發現的更詳細的示例:http://www.codeproject.com/Articles/866547/Publisher-Subscriber-pattern-with-Event-Delegate-a –