zoukankan      html  css  js  c++  java
  • 《CLR via C#》读书笔记 之 事件 明

    第十一章 事件

    2013-02-27

    11.1 设计要公开事件的类型
    11.3 设计侦听事件的类型
    11.4客户端操作

    ToDo: 用uml把类的关系画出来 

    为了帮助理解事件如何工作,先描述一个和事件相关的场景。假定现在要设计一个电子邮件系统,它的功能是:当邮件到达时,用户可以设置将邮件发送给传真机或寻呼机。

    11.1 设计要公开事件的类型


    返回

    第一步:定义一个类型来容纳发送给事件通知者的信息

    第二步:定义事件成员

    第三步:定义一个负责引发事件的方法,它通知已登记对象

    第四步:定义方法将输入转化为期望事件

     1     //step1:定义一个类型来容纳发送给事件通知者的信息
     2     class NewMailEventArgs : EventArgs
     3     {
     4         private readonly String m_from, m_to, m_subject;
     5         public String From { get { return m_from; } }
     6         public String To { get { return m_to; } }
     7         public String Subject { get { return m_subject; } } 
     8 
     9         public NewMailEventArgs(String from, String to, String subject)
    10         {
    11             m_from = from; m_to = to; m_subject = subject;
    12         }       
    13     } 
    14 
    15     class MailManager
    16     {
    17         //step2: 定义事件成员
    18         public event EventHandler<NewMailEventArgs> NewMail; 
    19 
    20         //step3:定义一个负责引发事件的方法,它通知已登记对象
    21         protected virtual void OnNewMail(NewMailEventArgs e)
    22         {
    23             //// .net framework最初发表时引发事件方式
    24             //if (NewMail != null) NewMail(this, e); 
    25 
    26             //定义方法将输入转化为期望事件
    27             EventHandler<NewMailEventArgs> temp = System.Threading.Interlocked.CompareExchange(ref NewMail, null, null);
    28             //任何方法登记了对事件的关注,通知他们
    29             if (temp != null) temp(this, e);
    30         } 
    31 
    32         //step4:定义方法将输入转化为期望事件
    33         public void SimulateNewMail(String from, String to, String subject)
    34         {
    35             NewMailEventArgs e = new NewMailEventArgs(from, to, subject);
    36             OnNewMail(e);
    37         }
    38     }

    11.3 设计侦听事件的类型


    返回 

     1     class Fax
     2     {
     3         public Fax(MailManager mm)
     4         {
     5             mm.NewMail += FaxMsg;
     6         } 
     7 
     8         private void FaxMsg(Object sender, NewMailEventArgs e)
     9         {
    10             Console.WriteLine("Faxing mail message:");
    11             Console.WriteLine("   From={0}, To={1}, Subject={2}", e.From, e.To, e.Subject);
    12         } 
    13 
    14         public void Unregister(MailManager mm)
    15         {
    16             mm.NewMail -= FaxMsg;
    17         }
    18     }

    11.4客户端操作


    返回 

    1         static void Main(string[] args)
    2         {
    3             MailManager manager = new MailManager();
    4             Fax fax = new Fax(manager);
    5             manager.SimulateNewMail("北京", "上海", "通知");
    6             fax.Unregister(manager);
    7             manager.SimulateNewMail("上海", "北京", "通知");
    8             Console.Read();
    9         }    
  • 相关阅读:
    0.Mysql优化框架
    [C]extern char **environ
    [C]Armstrong Number
    [C]struct, union的结合
    [C]enum类型
    [C]fibonacci series, recursion, time.h
    [C/JAVA]二维数组
    [C] char**, swich-case, refactoring, stdbool.h
    hardly/scarcely ... goes by without ...
    [C]随机数生成
  • 原文地址:https://www.cnblogs.com/Ming8006/p/2934801.html
Copyright © 2011-2022 走看看