返回目錄html
以前寫過一篇裝飾器模式的文章,感受不夠深刻,此次的例子是實現項目中遇到的,因此把它拿出來,再寫寫,以前也寫過消息組件的文章,主要採用了策略模式實現的,即每一個項目能夠經過配置進行一種消息的訂製,如,你能夠訂製email,sms,rtx,qq等,但不能同時採用多種機制完成消息的發送,這在一些狀況下是沒有問題的,但有時,咱們也須要同時爲客戶提供多種消息的推送,這在目前仍是挺現時的,如在用戶下單後,同時爲它發email 和短信進行經過,並對每一個訂單的過程進行跟蹤並通知給用戶,這對於用戶來講,體驗很是不錯!ide
1 消息元件抽象 MessageComponentthis
2 默認的消息實現者DefaultMessagespa
3 裝飾器抽象 Decorator設計
4 實現Email消息的裝飾器 EmailDecorator日誌
5 實現SMS消息的裝飾器 SMSDecoratorcode
using System; namespace test { /// <summary> /// 消息發送元件 /// </summary> public abstract class MessageComponent { public abstract void Send (string message); } /// <summary> /// 默認實現消息發達,能夠記錄日誌,訂閱事件,實現默認的發送消息等功能 /// </summary> public class DefaultMessage:MessageComponent { public override void Send (string message) { Console.WriteLine ("默認的消息發送機制"); } } /// <summary> /// 對消息發送的裝飾,如加個Email發送,SMS發送等 /// </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消息發送裝飾器 /// </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發送消息..."); } } /// <summary> /// SMS消息發送裝飾器 /// </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發送消息..."); } } }
調用代碼以下:htm
MessageComponent defaultMessage = new DefaultMessage (); Decorator emailDecorator = new EmailDecorator (defaultMessage); Decorator smsDecorator = new SMSDecorator (emailDecorator);//把emailDecorator添加到sms後,同時它集成了defaultMessage smsDecorator.Send ("倉儲大叔消息組件...");
結果:blog
而若是隻但願使用sms發送,那就是:事件
Decorator smsDecorator = new SMSDecorator (); smsDecorator.Send ("倉儲大叔消息組件...");
但願本文章能夠給初學者帶來收穫,呵呵!