view plaincopy to clipboardprint? public class SendMailEventArgs:EventArgs { //只讀的信息字段 public readonly string Message; public SendMailEventArgs(string message) { this.Message = message; } } public class SendMailEventArgs:EventArgs { //只讀的信息字段 public readonly string Message; public SendMailEventArgs(string message) { this.Message = message; } }
事件源類.
view plaincopy to clipboardprint? class MailManager { //郵件 public System.Net.Mail.MailMessage MailMess { set { MailMess = value; } get { return new System.Net.Mail.MailMessage(); } } //用.net框架提供的泛型委托定義一個事件 public event EventHandler<SendMailEventArgs> SendMail; //負責引發事件的方法 protected virtual void OnSendMial(SendMailEventArgs e) { EventHandler<SendMailEventArgs> sendMail=SendMail; if (sendMail != null) { //通知所有訂閱者 sendMail(this, e); } } //負責將外部調用轉化為事件 public void SendToMail() { if (String.IsNullOrEmpty(MailMess.Subject) || string.IsNullOrEmpty(MailMess.Body)) { Console.WriteLine("郵件發送失敗!"); } else { Console.WriteLine("發送郵件:{0}", MailMess.Subject); //用郵件的Subject實例化一個事件信息類 SendMailEventArgs sendMailEventArgs = new SendMailEventArgs(MailMess.Subject); //通知所有事件訂閱者 this.OnSendMial(sendMailEventArgs); } } } class MailManager { //郵件 public System.Net.Mail.MailMessage MailMess { set { MailMess = value; } get { return new System.Net.Mail.MailMessage(); } } //用.net框架提供的泛型委托定義一個事件 public event EventHandler<SendMailEventArgs> SendMail; //負責引發事件的方法 protected virtual void OnSendMial(SendMailEventArgs e) { EventHandler<SendMailEventArgs> sendMail=SendMail; if (sendMail != null) { //通知所有訂閱者 sendMail(this, e); } } //負責將外部調用轉化為事件 public void SendToMail() { if (String.IsNullOrEmpty(MailMess.Subject) || string.IsNullOrEmpty(MailMess.Body)) { Console.WriteLine("郵件發送失敗!"); } else { Console.WriteLine("發送郵件:{0}", MailMess.Subject); //用郵件的Subject實例化一個事件信息類 SendMailEventArgs sendMailEventArgs = new SendMailEventArgs(MailMess.Subject); //通知所有事件訂閱者 this.OnSendMial(sendMailEventArgs); } } }
事件監聽類
view plaincopy to clipboardprint? class MobilePhone { #region SendHandler 成員
public void SendMessage(object sender,SendMailEventArgs e) { Console.WriteLine("手機信息:{0}", e.Message); }
#endregion } public class RTX { #region SendHandler 成員
public void SendMessage(object sender,SendMailEventArgs e) { Console.WriteLine("RTX信息:{0}", e.Message); }
#endregion } class MobilePhone { #region SendHandler 成員
public void SendMessage(object sender,SendMailEventArgs e) { Console.WriteLine("手機信息:{0}", e.Message); }
#endregion } public class RTX { #region SendHandler 成員
public void SendMessage(object sender,SendMailEventArgs e) { Console.WriteLine("RTX信息:{0}", e.Message); }
#endregion }
下面是客戶端的調用
view plaincopy to clipboardprint? class Program { static void Main(string[] args) { //事件監聽源實例 MailManager mailManager = new MailManager(); //為Mail添加主題和內容 mailManager.MailMess.Subject = "通知"; mailManager.MailMess.Body = "觀察者模式的學習。"; mailManager.SendMail+=new MobilePhone().SendMessage;//注冊手機通知 mailManager.SendMail+=new RTX().SendMessage;//注冊RTX通知 mailManager.SendToMail();//發送郵件 Console.WriteLine("按任意鍵繼續……"); Console.ReadKey(); } }