欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最后就是我們?cè)谥鞒绦蛑姓{(diào)用AlarmContext來發(fā)出報(bào)警,具體的調(diào)用代碼如下:

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

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

     }
}

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

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

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

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

相關(guān)文章

  • TextBox獲取輸入焦點(diǎn)時(shí)自動(dòng)全選的實(shí)現(xiàn)方法

    TextBox獲取輸入焦點(diǎn)時(shí)自動(dòng)全選的實(shí)現(xiàn)方法

    TextBox獲取輸入焦點(diǎn)時(shí)自動(dòng)全選的實(shí)現(xiàn)方法,需要的朋友可以參考一下
    2013-03-03
  • C# CultureInfo之常用InvariantCulture案例詳解

    C# CultureInfo之常用InvariantCulture案例詳解

    這篇文章主要介紹了C# CultureInfo之常用InvariantCulture案例詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 分享一個(gè)C#編寫簡(jiǎn)單的聊天程序(詳細(xì)介紹)

    分享一個(gè)C#編寫簡(jiǎn)單的聊天程序(詳細(xì)介紹)

    這是一篇基于Socket進(jìn)行網(wǎng)絡(luò)編程的入門文章,我對(duì)于網(wǎng)絡(luò)編程的學(xué)習(xí)并不夠深入,這篇文章是對(duì)于自己知識(shí)的一個(gè)鞏固,同時(shí)希望能為初學(xué)的朋友提供一點(diǎn)參考。文章大體分為四個(gè)部分:程序的分析與設(shè)計(jì)、C#網(wǎng)絡(luò)編程基礎(chǔ)(篇外篇)、聊天程序的實(shí)現(xiàn)模式、程序?qū)崿F(xiàn)
    2015-12-12
  • c#基于WinForm的Socket實(shí)現(xiàn)簡(jiǎn)單的聊天室 IM

    c#基于WinForm的Socket實(shí)現(xiàn)簡(jiǎn)單的聊天室 IM

    這篇文章主要介紹了c#基于WinForm的Socket實(shí)現(xiàn)簡(jiǎn)單的聊天室 IM的步驟,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-05-05
  • 使用C#判斷一個(gè)字符串是否包含大寫字符的五種方法

    使用C#判斷一個(gè)字符串是否包含大寫字符的五種方法

    本文提供了五種判斷字符串是否包含大寫字符的方法及其實(shí)現(xiàn)源碼,文中通過代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-12-12
  • C#實(shí)現(xiàn)中文日歷Calendar

    C#實(shí)現(xiàn)中文日歷Calendar

    這篇文章介紹了C#實(shí)現(xiàn)中文日歷Calendar的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • WPF利用TextBlock實(shí)現(xiàn)查找結(jié)果高亮顯示效果

    WPF利用TextBlock實(shí)現(xiàn)查找結(jié)果高亮顯示效果

    在應(yīng)用開發(fā)過程中,經(jīng)常遇到這樣的需求:通過關(guān)鍵字查找數(shù)據(jù),把帶有關(guān)鍵字的數(shù)據(jù)顯示出來,同時(shí)在結(jié)果中高亮顯示關(guān)鍵字,所以本文就來和大家介紹一下如何利用TextBlock實(shí)現(xiàn)查找結(jié)果高亮顯示效果吧
    2023-08-08
  • C#實(shí)現(xiàn)Menu和ContextMenu自定義風(fēng)格及contextMenu自定義

    C#實(shí)現(xiàn)Menu和ContextMenu自定義風(fēng)格及contextMenu自定義

    ContextMenu 類表示當(dāng)用戶在控件或窗體的特定區(qū)域上單擊鼠標(biāo)右鍵時(shí)會(huì)顯示的快捷菜單,要想實(shí)現(xiàn)自定義的Menu和ContextMenu效果,大家可以通過派生ProfessionalColorTable類,下面小編把實(shí)現(xiàn)Menu和ContextMenu自定義風(fēng)格及ContextMenu自定義給大家整理一下
    2015-08-08
  • C#創(chuàng)建windows系統(tǒng)用戶的方法

    C#創(chuàng)建windows系統(tǒng)用戶的方法

    這篇文章主要介紹了C#創(chuàng)建windows系統(tǒng)用戶的方法,涉及C#操作用戶名、密碼、顯示名稱、描述、是否強(qiáng)制修改密碼、密碼是否過期等技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-04-04
  • C#?計(jì)算DataTime的4種時(shí)間差的方法(相差天數(shù)、相差小時(shí)、相差分鐘、相差秒)

    C#?計(jì)算DataTime的4種時(shí)間差的方法(相差天數(shù)、相差小時(shí)、相差分鐘、相差秒)

    這篇文章主要介紹了C#?計(jì)算DataTime的4種時(shí)間差(相差天數(shù)、相差小時(shí)、相差分鐘、相差秒),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-05-05

最新評(píng)論