委托和事件(五)--例子--涵盖了观察者设计模式

场景:当我们用信用卡刷完钱的时候,我们就会接收到手机短信,或者是电子邮件,其实这就是Observer pattern(观察者模式)

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值