說說設計模式~裝飾器模式(Decorator)~多功能消息組件的實現(xiàn)
為何要設計多功能消息組件
之前寫過一篇裝飾器模式的文章,感覺不夠深入,這次的例子是實現(xiàn)項目中遇到的,所以把它拿出來,再寫寫,之前也寫過消息組件的文章,主要采用了策略模式實現(xiàn)的,即每個項目可以通過配置進行一種消息的訂制,如,你可以訂制email,sms,rtx,qq等,但不能同時采用多種機制完成消息的發(fā)送,這在一些情況下是沒有問題的,但有時,我們也需要同時為客戶提供多種消息的推送,這在目前還是挺現(xiàn)時的,如在用戶下單后,同時為它發(fā)email 和短信進行通過,并對每個訂單的過程進行跟蹤并通知給用戶,這對于用戶來說,體驗非常不錯!
多功能消息組件的組成
1 消息元件抽象 MessageComponent
2 默認的消息實現(xiàn)者DefaultMessage
3 裝飾器抽象 Decorator
4 實現(xiàn)Email消息的裝飾器 EmailDecorator
5 實現(xiàn)SMS消息的裝飾器 SMSDecorator
下面將部分核心代碼公開于世
using System; namespace test { /// <summary> /// 消息發(fā)送元件 /// </summary> public abstract class MessageComponent { public abstract void Send (string message); } /// <summary> /// 默認實現(xiàn)消息發(fā)達,可以記錄日志,訂閱事件,實現(xiàn)默認的發(fā)送消息等功能 /// </summary> public class DefaultMessage:MessageComponent { public override void Send (string message) { Console.WriteLine ("默認的消息發(fā)送機制"); } } /// <summary> /// 對消息發(fā)送的裝飾,如加個Email發(fā)送,SMS發(fā)送等 /// </summary> public abstract class Decorator:MessageComponent { private MessageComponent _messageContaion; public Decorator (MessageComponent messageContaion) { _messageContaion = messageContaion; } public override void Send (string message) { if (_messageContaion != null) _messageContaion.Send (message); } } /// <summary> /// Email消息發(fā)送裝飾器 /// </summary> public class EmailDecorator:Decorator { public EmailDecorator () : this (null) { } public EmailDecorator (MessageComponent messageContaion) : base (messageContaion) { } public override void Send (string message) { base.Send (message); Console.WriteLine ("采用Email發(fā)送消息..."); } } /// <summary> /// SMS消息發(fā)送裝飾器 /// </summary> public class SMSDecorator:Decorator { public SMSDecorator () : this (null) { } public SMSDecorator (MessageComponent messageContaion) : base (messageContaion) { } public override void Send (string message) { base.Send (message); Console.WriteLine ("采用SMS發(fā)送消息..."); } } }
調用代碼如下:
MessageComponent defaultMessage = new DefaultMessage (); Decorator emailDecorator = new EmailDecorator (defaultMessage); Decorator smsDecorator = new SMSDecorator (emailDecorator);//把emailDecorator添加到sms后,同時它集成了defaultMessage smsDecorator.Send ("倉儲大叔消息組件...");
結果:
而如果只希望使用sms發(fā)送,那就是:
Decorator smsDecorator = new SMSDecorator (); smsDecorator.Send ("倉儲大叔消息組件...");
希望本文章可以給初學者帶來收獲,呵呵!
浙公網安備 33010602011771號