最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2014年01月07日 09:19:12   作者:  
服務(wù)的功能:這個服務(wù)就是能夠?qū)崿F(xiàn)多通路報警的服務(wù),比如郵件報警、客戶端報警、短信報警等,該服務(wù)靈活性還不錯,比較方便擴(kuò)展

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

復(fù)制代碼 代碼如下:

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

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

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

復(fù)制代碼 代碼如下:

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

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

復(fù)制代碼 代碼如下:

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

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

復(fù)制代碼 代碼如下:

/// <summary>
/// 統(tǒng)一發(fā)出各種報警的類,將所有調(diào)用報警的操作封裝在這個類中,主程序需要報警時,直接調(diào)用這個類就可以,無需知道其他任何類的存在
/// </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("通過反射構(gòu)造報警實例時出現(xiàn)異常:" + ex);
          }
       }
   }

   /// <summary>
   /// 通過發(fā)射,調(diào)用不同的報警方式
   /// </summary>
   public void HandleMessage(Message message)
   {
       foreach (AlarmWay way in Enum.GetValues(typeof(AlarmWay)))
       {
           //遍歷所有的報警方式,每一種報警方式與message.AlarmWays進(jìn)行按位與運(yùn)算,如果運(yùn)算結(jié)果仍然為當(dāng)前遍歷的報警方式,則說明Message中包含這種報警方式
           if ((message.AlramWays & way) == way)
           {
               try
               {
                   _alarmsDic[way].Alarm(message);
               }
               catch (Exception ex)
               {
                   //記錄錯誤日志
               }
            }
       }
   }
}

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

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

復(fù)制代碼 代碼如下:

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

     }
}

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

復(fù)制代碼 代碼如下:

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

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

相關(guān)文章

  • 解析c#在未出現(xiàn)異常情況下查看當(dāng)前調(diào)用堆棧的解決方法

    解析c#在未出現(xiàn)異常情況下查看當(dāng)前調(diào)用堆棧的解決方法

    本篇文章是對c#在未出現(xiàn)異常情況下查看當(dāng)前調(diào)用堆棧的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C#開發(fā)中常用的加密解密方法匯總

    C#開發(fā)中常用的加密解密方法匯總

    這篇文章主要介紹了C#開發(fā)中常用的加密解密方法匯總,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2020-11-11
  • WPF調(diào)用ffmpeg實現(xiàn)屏幕錄制

    WPF調(diào)用ffmpeg實現(xiàn)屏幕錄制

    這篇文章主要為大家詳細(xì)介紹了WPF如何調(diào)用ffmpeg實現(xiàn)屏幕錄制,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)或工作有一定幫助,感興趣的小伙伴可以了解一下
    2023-05-05
  • C#從畫刷創(chuàng)建畫筆的方法

    C#從畫刷創(chuàng)建畫筆的方法

    這篇文章主要介紹了C#從畫刷創(chuàng)建畫筆的方法,涉及C#圖形繪制的基本技巧,需要的朋友可以參考下
    2015-06-06
  • C#使用 NAudio 實現(xiàn)音頻可視化的方法

    C#使用 NAudio 實現(xiàn)音頻可視化的方法

    這篇文章主要介紹了[C#] 使用 NAudio 實現(xiàn)音頻可視化的相關(guān)資料,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-05-05
  • C#并查集(union-find)算法詳解

    C#并查集(union-find)算法詳解

    本文詳細(xì)講解了C#并查集(union-find)算法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • C#操作Excel的多種方式小結(jié)

    C#操作Excel的多種方式小結(jié)

    在項目開發(fā)過程和辦公過程中,經(jīng)常要遇到對Excel進(jìn)行創(chuàng)建,讀寫等操作,本文為大家整理了一些C#操作Excel的方法,感興趣的小伙伴可以了解一下
    2024-11-11
  • Parallel.For循環(huán)與普通for循環(huán)的性能比較

    Parallel.For循環(huán)與普通for循環(huán)的性能比較

    這篇文章介紹了Parallel.For循環(huán)與普通for循環(huán)的性能比較,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • C# 如何判斷兩個文件內(nèi)容是否相同的方法

    C# 如何判斷兩個文件內(nèi)容是否相同的方法

    使用System.security.Cryptography.HashAlgorithm類為每個文件生成一個哈希碼,然后比較兩個哈希碼是否相同
    2013-05-05
  • C#中托管DLL和非托管DLL的區(qū)別詳解

    C#中托管DLL和非托管DLL的區(qū)別詳解

    這篇文章主要介紹了C#中托管DLL和非托管DLL的區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10

最新評論

平远县| 阿瓦提县| 嘉兴市| 余姚市| 确山县| 枞阳县| 凤台县| 孟州市| 鄂温| 板桥市| 龙江县| 黑龙江省| 宁德市| 嘉峪关市| 金湖县| 江阴市| 新余市| 凤山县| 通江县| 昆明市| 焦作市| 康平县| 图们市| 磐安县| 洪洞县| 堆龙德庆县| 隆子县| 清新县| 磐石市| 永昌县| 利川市| 嫩江县| 江川县| 麻江县| 驻马店市| 临西县| 三穗县| 武川县| 白玉县| 赤城县| 南靖县|