亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > 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呢?

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产日韩av在线播放| 亚洲精品福利视频| 亚洲人av在线影院| 久色乳综合思思在线视频| 国内精品久久久久影院优| 国产精品夫妻激情| 久久久久久成人精品| 亚洲激情小视频| 国产99久久久欧美黑人| 九九热r在线视频精品| 成人日韩av在线| 国产日产亚洲精品| 精品久久久香蕉免费精品视频| 揄拍成人国产精品视频| 亚洲高清福利视频| zzjj国产精品一区二区| 久久视频免费观看| 久久久久久高潮国产精品视| 欧美老女人xx| 一本色道久久88亚洲综合88| 成人字幕网zmw| 亚洲最大av在线| 欧美日韩另类字幕中文| 国产精品一区二区三区毛片淫片| 日韩在线免费av| 国产精品自产拍在线观看| 久久精品亚洲94久久精品| 成人h视频在线观看播放| 国产一区二区黑人欧美xxxx| 一区二区福利视频| 欧美一区第一页| 热99在线视频| 国产欧美日韩最新| 亚洲最大的av网站| 欧美激情精品久久久| 奇米4444一区二区三区| 国产精品 欧美在线| 日本在线精品视频| 国产精品2018| 欧美日韩国产限制| 丝袜情趣国产精品| 少妇av一区二区三区| 91精品91久久久久久| 欧美性理论片在线观看片免费| 亚洲精品视频免费| 亚洲影影院av| 亚洲成人精品久久| 久久视频国产精品免费视频在线| 中文字幕亚洲综合| 在线观看欧美视频| 国产精品第1页| 日本欧美一级片| 超薄丝袜一区二区| 成人a在线观看| 最好看的2019的中文字幕视频| 国产在线999| 欧美成人免费播放| 日本19禁啪啪免费观看www| 91久久在线播放| 国产成人av网| 欧美特黄级在线| 国产在线拍偷自揄拍精品| 欧美一区第一页| 欧美最顶级丰满的aⅴ艳星| www亚洲精品| 欧美多人乱p欧美4p久久| 亚洲国产精品系列| 国产女同一区二区| 亚洲国产美女精品久久久久∴| 久久久久久久久网站| 欧美激情网友自拍| 一区三区二区视频| 欧美自拍大量在线观看| 在线日韩日本国产亚洲| 国产第一区电影| 久久精品成人欧美大片古装| 亚洲欧美国产日韩中文字幕| 国产精品久久久久久久av大片| 国产女同一区二区| 亚洲护士老师的毛茸茸最新章节| 亚洲性视频网址| 欧美精品激情视频| 亚洲区在线播放| 最近2019中文字幕一页二页| 欧美在线性视频| 亚洲在线免费看| 亚洲精品720p| 亚洲三级免费看| 欧美亚洲另类制服自拍| 黑人与娇小精品av专区| 亚洲一区二区三区在线视频| 欧美激情视频网址| 亚洲小视频在线| 久久精品国产欧美激情| 国模叶桐国产精品一区| 欧洲成人午夜免费大片| 在线观看日韩欧美| 欧美高清激情视频| 日韩在线观看免费网站| 3344国产精品免费看| 亚洲免费伊人电影在线观看av| 亚洲va久久久噜噜噜久久天堂| 国产成人精品一区二区| 国色天香2019中文字幕在线观看| 91精品国产成人| 成人夜晚看av| 亚洲精品黄网在线观看| 国产精品自拍偷拍| 日韩人体视频一二区| 91在线视频免费| 亚州成人av在线| 国产精品xxx视频| 最新的欧美黄色| 69**夜色精品国产69乱| 欧美日韩精品在线观看| 亚洲日本成人网| 热久久免费视频精品| 久久亚洲精品中文字幕冲田杏梨| 免费不卡欧美自拍视频| 日韩一区二区久久久| 日韩av在线天堂网| 久久精品电影网| 国产精品久久久久久搜索| 久久久久久69| 国产精品高潮呻吟久久av无限| 欧美精品久久久久久久久| 成人免费福利视频| 欧美黑人狂野猛交老妇| 欧美精品激情在线| 精品久久久国产精品999| 久久久亚洲福利精品午夜| 国产精品久久久久久久美男| 在线观看日韩www视频免费| 亚洲男人天堂九九视频| 欧美最顶级丰满的aⅴ艳星| 亚洲精品日韩激情在线电影| 97免费视频在线| 久久久久这里只有精品| 成人性生交大片免费观看嘿嘿视频| 亲子乱一区二区三区电影| 日韩在线观看视频免费| 亚洲精品成人久久久| 中文字幕在线看视频国产欧美在线看完整| 精品国偷自产在线视频| 在线日韩欧美视频| 国产亚洲精品一区二555| 欧美激情一区二区三区在线视频观看| 美女视频久久黄| 午夜精品在线视频| 亚洲欧美日韩精品久久亚洲区| 久久久视频免费观看| 国产精品高清免费在线观看| 亚洲精品综合久久中文字幕| 色偷偷亚洲男人天堂| 亚洲欧洲视频在线| 欧美成人在线影院| 精品av在线播放| 亚洲欧洲日产国产网站| 九九热最新视频//这里只有精品| 欧美综合第一页| 欧美日韩人人澡狠狠躁视频| 在线精品国产成人综合| 亚洲欧美国产日韩天堂区| 51视频国产精品一区二区|