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(); } }