a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C# > 正文

使用策略模式實現報警服務示例詳解(短信報警)

2020-01-24 02:56:24
字體:
來源:轉載
供稿:網友

著重說一下策略模式。首先需要定義一個接口,該接口用來統一報警方法,代碼如下:

復制代碼 代碼如下:

/// <summary>
/// 報警接口,統一各種報警方式發出報警的方法
/// </summary>
public interface IAlarm
{
  void Alarm(Message message);
}

大家伙看到Message會不會比較疑惑呢,別著急,Message就是我自己定義的一個報警的模型,比如報警標題,收件人(報警報給誰呢),報警方式(郵件、客戶端等)等。

定義好接口之后,我們就要實現這個接口,實現這個接口的就是各種報警方式的類,比如EmailAlarm.cs和ClientAlarm.cs,下面是郵件報警的具體實現,EmailAlarm.cs的代碼(需要實現IAlarm接口的Alarm方法):

復制代碼 代碼如下:

/// <summary>
/// 郵件報警
/// </summary>
public class EmailAlarm : IAlarm
{
  /// <summary>
   /// 發送郵件實現了IAlarm接口的Alarm()方法
   /// </summary>
   /// <param name="messag"></param>
   public void Alarm(Message message)
   {
    // 此處為郵件報警的具體實現代碼
   }
}

下面是客戶端報警的具體實現,ClientAlarm.cs(同樣需要實現IAlarm接口的Alarm()方法)

復制代碼 代碼如下:

/// <summary>
/// 客戶端報警
/// </summary>
public class ClientAlarm : IAlarm
{
     /// <summary>
     /// 實現接口IAlarm接口的Alarm()方法
     /// </summary>
     public void Alarm(Message message)
     {
         //此處為客戶端實現報警的具體代碼
     }
}

好了,基礎工作都做完,接下來我們面臨的問題是我們該如何調用不同的報警實現呢?當然,在我們的報警模型Message中有報警方式這一字段,我們需要根據報警方式這個字段來發不同的報警。這個還不簡單,我們根據不同的報警方式生成不同的對象,然后各自調用Alarm()方法就ok。當然,這是一種解決方法,但是這是最好的解決方法嗎?of course not!聽說過反射嗎,小伙伴們?接下來,我將介紹如何利用反射來調用不同的報警方式:

復制代碼 代碼如下:

/// <summary>
/// 統一發出各種報警的類,將所有調用報警的操作封裝在這個類中,主程序需要報警時,直接調用這個類就可以,無需知道其他任何類的存在
/// </summary>
public class AlarmContext
{
  private static readonly IDictionary<AlarmWay,IAlarm> _alarmsDic = new Dictionary<AlarmWay, IAlarm>();
  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);
          }
       }
   }

   /// <summary>
   /// 通過發射,調用不同的報警方式
   /// </summary>
   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)
               {
                   //記錄錯誤日志
               }
            }
       }
   }
}

看到AlarmWay是不是又混亂了呢?千萬別亂,AlarmWay就是我定義的一個枚舉類型,里面包含了各種報警方式,具體的代碼我會在文章的最后貼出。我們現在還是著重討論上面的代碼,親愛的小伙伴們,看到上面的靜態構造函數了嗎?知道為什么要這樣寫嗎?我們在靜態構造函數中利用反射將枚舉中所有的報警對象保存在IDictionary中,具體的保存如_alarmsDic['Email'] = (IAlarm)EmailAlarm。這樣做的好處小伙伴們自己琢磨吧,嘻嘻。

最后就是我們在主程序中調用AlarmContext來發出報警,具體的調用代碼如下:

復制代碼 代碼如下:

class Program
 {
    static void Main(string[] args)
     {
        Console.WriteLine("報警服務已啟動。。。");
        //message應該是從別的程序傳遞過來的需要報警的消息,比如在Redis隊列中獲取message,具體怎么獲取根據需求而定。在這里為了方便,我新生成一個對象,其實不應該這樣做
        Message message = new Message();
        AlarmContext context = new AlarmContext();
        context.HandleMessage(message);

     }
}

OK,到此為止,利用策略模式設計的報警服務就介紹完畢啦。這篇文章的主要知識點我認為有兩個,一個是策略模式,另一個就是利用反射。希望廣大的小伙伴們提出寶貴的意見,最后,貼出枚舉AlarmWay的代碼:

復制代碼 代碼如下:

/// <summary>
/// 報警方式
/// </summary>
public enum AlarmWay
{
    Email = 1,
    Client = 2,
    ShortMessage = 4
}

順便,小伙伴們思考一下為什么ShortMessage的值是4而不是3呢?

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 精品www| 高清一区二区 | 日韩精品一区二区三区第95 | 亚洲欧美日韩另类精品一区二区三区 | 国产精品99久久久久久动医院 | 欧美 日韩 中文字幕 | 欧美一级免费 | 日韩在线免费 | 99国产精品99久久久久久 | 精品国产精品国产偷麻豆 | 亚洲午夜成激人情在线影院 | 99精品视频免费在线观看 | 凹凸日日摸日日碰夜夜爽孕妇 | 免费99精品国产自在在线 | 久久伊人久久 | 国产欧美日韩精品一区二区三区 | 精品国产乱码一区二区三 | 国产精品美女视频免费观看软件 | 日韩在线视频一区 | 欧美亚洲一| 国产精品久久久久久久久久久久久久 | 午夜免费影视 | 一级篇| 午夜看片在线观看 | 免费看的黄色大片 | 伊人一区 | 中国av在线 | 亚洲激情在线 | 一区二区av在线 | 久久国品片 | 亚州中文av | 成人av免费观看 | 日本视频免费高清一本18 | 狠操av| 中国免费看的片 | 亚州中文av | 欧美一级二级在线观看 | 一级黄色毛片a | 日韩免费在线视频 | 亚洲综合一区二区三区 | 久久久久久综合 |