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

posted on 2014-11-07 14:06  忙碌ing  阅读(437)  评论(0)    收藏  举报

导航