c#委托和事件--观察者模式

出处:http://www.cnblogs.com/wudiwushen/archive/2010/04/21/1717378.html

    //---本例场景为当用户从银行账号里取出钱后,马上通知电子邮件和发手机短信---
    //本例中的订阅者,也就是观察者是电子邮件与手机
    //发布者,也就是被监视对象是银行账号


    //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("jinjiangbo2008@163.com", "18868789776",amount);
            //初始化订阅系统
            SubscribSystem subject = new SubscribSystem(new BankAccount(), user);
            Console.ReadKey();
        }
    }

输出结果

这里写图片描述

Unity写法

    /// <summary>
    /// 监视者
    /// </summary>
    public class UserEngineEventArgs:EventArgs
    {
        public readonly string email;
        public readonly string phoneID;
        public readonly int money;
        public UserEngineEventArgs ( string email,string phoneID,int money )
        {
            this.email = email;
            this.phoneID = phoneID;
            this.money = money;
        }
    }
    /// <summary>
    /// 发布者,被监视者
    /// </summary>
    class BankRoom
    {
        public delegate void ProcessTranEventHandler ( object sender,UserEngineEventArgs e );
        public event ProcessTranEventHandler ProcessTran;

        protected virtual void OnProcessTran ( UserEngineEventArgs e )
        {
            if(ProcessTran!=null)
            {
                ProcessTran (this,e);
            }
        }
        public void Process ( UserEngineEventArgs e )
        {
            OnProcessTran (e);
        }
    }
    /// <summary>
    /// 观察者
    /// </summary>
    class User
    {
        public  void UseMoney ( object sender,UserEngineEventArgs e )
        {
            Debug.Log("用户邮箱:"+e.email+"用户电话:"+e.phoneID+"用户取款:"+e.money);
        }
    }
    /// <summary>
    /// 调用观察者的
    /// </summary>
    class SubSystem
    {
        public SubSystem ( BankRoom bankRoom,UserEngineEventArgs e )
        {
            //User a = new User ();
            bankRoom.ProcessTran += new BankRoom.ProcessTranEventHandler (new User().UseMoney);
            bankRoom.Process (e);
        }
    }

    private void Start ()
    {
        //初始化数据
        UserEngineEventArgs userEngineEvent = new UserEngineEventArgs ("13982@qq.com","18826456",500);
        BankRoom bankRoom = new BankRoom ();
        //初始化调用的类,传递委托
        SubSystem subSystem = new SubSystem (bankRoom,userEngineEvent);

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值