著重說一下策略模式。首先需要定義一個接口,該接口用來統一報警方法,代碼如下:
大家伙看到Message會不會比較疑惑呢,別著急,Message就是我自己定義的一個報警的模型,比如報警標題,收件人(報警報給誰呢),報警方式(郵件、客戶端等)等。
定義好接口之后,我們就要實現這個接口,實現這個接口的就是各種報警方式的類,比如EmailAlarm.cs和ClientAlarm.cs,下面是郵件報警的具體實現,EmailAlarm.cs的代碼(需要實現IAlarm接口的Alarm方法):
下面是客戶端報警的具體實現,ClientAlarm.cs(同樣需要實現IAlarm接口的Alarm()方法)
好了,基礎工作都做完,接下來我們面臨的問題是我們該如何調用不同的報警實現呢?當然,在我們的報警模型Message中有報警方式這一字段,我們需要根據報警方式這個字段來發不同的報警。這個還不簡單,我們根據不同的報警方式生成不同的對象,然后各自調用Alarm()方法就ok。當然,這是一種解決方法,但是這是最好的解決方法嗎?of course not!聽說過反射嗎,小伙伴們?接下來,我將介紹如何利用反射來調用不同的報警方式:
/// <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來發出報警,具體的調用代碼如下:
}
}
OK,到此為止,利用策略模式設計的報警服務就介紹完畢啦。這篇文章的主要知識點我認為有兩個,一個是策略模式,另一個就是利用反射。希望廣大的小伙伴們提出寶貴的意見,最后,貼出枚舉AlarmWay的代碼:
順便,小伙伴們思考一下為什么ShortMessage的值是4而不是3呢?
新聞熱點
疑難解答