C# 委托+事件 (观察者模式)
委托+事件 (观察者模式)
观察者模式的目的就是在对象之间定义一个一对多的依赖关系,从而当一个对象状态方式改变时,所有依赖这个对象的对象都能得到通知,并对上述改变做出反应!
比如对于一个对象,客户对其感兴趣的部分发生改变,这个对象应该通知客户。同时,对象中的哪些信息是客户感兴趣的呢?这个由客户来定义(UserEventArgs)!
在网络上看了些 ”委托+事件“ 的例子,自己试着写了小例子,保存起来防止以后忘记
例子的内容为:
在银行取钱,取钱后,系统会自动 使用 “邮件”和“手机”的方式通知取款信息
在开始之前,我们先搞懂 .Net Framework的编码规范:
一、委托类型的名称都应该以EventHandler结束。
二、委托的原型定义:有一个void返回值,并接受两个输入参数:一个Object 类型,一个 EventArgs类型(或继承自EventArgs)。
三、事件的命名为 委托去掉 EventHandler之后剩余的部分。
四、继承自EventArgs的类型应该以EventArgs结尾。
这就是微软编码的规范,当然这不仅仅是规则,而是在这种规则下使程序有更大的灵活性
--> //---本例场景为当用户从银行账号里取出钱后,马上通知电子邮件和发手机短信--- //本例中的订阅者,也就是观察者是电子邮件与手机 //发布者,也就是被监视对象是银行账号 //Obverser(电子邮件,手机)关心的对象e ,分别是邮件地址、手机号码、取款金额 public class UserEventArgs : EventArgs { public readonly string emailAddress; public readonly string mobilePhone; public readonly string amount; public UserEventArgs(string emailAddress, string mobilePhone,string amount) { this.emailAddress = emailAddress; this.mobilePhone = mobilePhone; this.amount = amount; } } //发布者,也就是被监视的对象-银行账号 class BankAccount { //声明一个处理银行交易的委托 public delegate void ProcessTranEventHandler(object sender, UserEventArgs e); //声明一个事件 public event ProcessTranEventHandler ProcessTran; protected virtual void OnProcessTran(UserEventArgs e) { if (ProcessTran != null) { ProcessTran(this, e); } } public void Prcess(UserEventArgs e) { OnProcessTran(e); } } //观察者Email class Email { public static void SendEmail(object sender, UserEventArgs e) { Console.WriteLine("向用户邮箱" + e.emailAddress + "发送邮件:您在"+System.DateTime.Now.ToString()+"取款金额为"+e.amount); } } //观察者手机 class Mobile { public static void SendNotification(object sender, UserEventArgs e) { Console.WriteLine("向用户手机" + e.mobilePhone + "发送短信:您在" + System.DateTime.Now.ToString() + "取款金额为" + e.amount); } } //订阅系统,实现银行系统订阅几个Observer,实现与客户端的松耦合 class SubscribSystem { public SubscribSystem() { } public SubscribSystem(BankAccount bankAccount, UserEventArgs e) { //现在我们在银行账户订阅2个,分别是电子邮件和手机短信 bankAccount.ProcessTran += new BankAccount.ProcessTranEventHandler(Email.SendEmail); bankAccount.ProcessTran += new BankAccount.ProcessTranEventHandler(Mobile.SendNotification); bankAccount.Prcess(e); } } class Client { public static void Main(string[] args) { Console.Write("请输入您要取款的金额:"); string amount = Console.ReadLine(); Console.WriteLine("交易成功,请取磁卡。"); //初始化e UserEventArgs user = new UserEventArgs("11111111111@163.com", "13911238456",amount); //初始化订阅系统 SubscribSystem subject = new SubscribSystem(new BankAccount(), user); Console.ReadKey(); } }
简化后的写法
public class UserEventArgs : EventArgs { public readonly string emailAddress; public readonly string phone; public readonly string amount; public UserEventArgs() { } public UserEventArgs(string emailAddress, string phone, string amount) { this.emailAddress = emailAddress; this.phone = phone; this.amount = amount; } }
public class BankAccount { public delegate void ProcessTranEventHandler(object obj,UserEventArgs e); public event ProcessTranEventHandler ProcessTran; public virtual void OnProcessTran(UserEventArgs e) { if (ProcessTran != null) { ProcessTran(this, e); } } //public void Prcess(UserEventArgs e) //{ // OnProcessTran(e); //} }
#region MyRegion //观察者Email class Email { public static void SendEmail(object sender, UserEventArgs e) { Console.WriteLine("向用户邮箱" + e.emailAddress + "发送邮件:您在" + System.DateTime.Now.ToString() + "取款金额为" + e.amount); } } //观察者手机 class Mobile { public static void SendNotification(object sender, UserEventArgs e) { Console.WriteLine("向用户手机" + e.phone + "发送短信:您在" + System.DateTime.Now.ToString() + "取款金额为" + e.amount); } } #endregion
public static void Main(string[] args)
{
string amount = "500"; Console.WriteLine("交易成功,请取磁卡。"); //初始化e UserEventArgs user = new UserEventArgs("jinjiangbo2008@163.com", "18868789776", amount); //初始化订阅系统 //SubscribSystem subject = new SubscribSystem(new BankAccount(), user); BankAccount bank = new BankAccount(); bank.ProcessTran += Email.SendEmail; bank.ProcessTran += Mobile.SendNotification; bank.OnProcessTran(user);
}
文章转载:http://www.cnblogs.com/wudiwushen/archive/2010/04/20/1703368.html
浙公网安备 33010602011771号