zoukankan      html  css  js  c++  java
  • 俗人理解的事件和委托

    什么是事件不多讲了,直入主题让我们来看看事件中的两个角色:

    一:事件发行者(Publisher):一个事件发行者,也称作发送者(sender),其实就是一个对象,这个

    对象会自行维护本身的状态信息。当本身状态信息变动时,便会触发一个事件,并通知所有的事件

    订阅者。
    二:事件订阅者(subscriber):对事件感兴趣的对象,也叫做接受者(receiver),可以注册感兴趣的

    事件,通常需提供一个事件处理程序,在事件发行者触发一个事件后,会自动执行这段代码的内容
    下面通过讲故事来理解事件

         订阅者到出版社订阅报刊,报刊一旦发行就会送到订阅者手中。

    在这个故事中,图书的出版就是事件,出版局就是事件的发行者,订户是事件的订阅者。

     1using System;
     2using System.Collections.Generic;
     3
     4namespace evnt
     5{
     6    class Publisher //出版社
     7    {
     8        public delegate void Publish(); //事件所需的代理
     9        public event Publish OnPublish=null;//事件的声明
    10        public void issu() //触发事件的方法
    11        {
    12            if(OnPublish!=null)
    13            {
    14                Console.WriteLine("发行刊物");
    15                OnPublish();
    16                Console.ReadLine();
    17            }

    18        }

    19    }

    20    
    21    class Subscriber //订阅者
    22    {
    23        public void Receive()//在事件订阅者中定义事件处理程序
    24        {
    25            Console.WriteLine("订阅者已经收到了刊物");
    26        }

    27    }

    28    
    29    class Story //故事发生在订阅者和出版社之间
    30    {
    31        static void Main()
    32        {
    33            Publisher Pub=new Publisher();
    34            Subscriber zs=new Subscriber();
    35            Pub.OnPublish+=new Publisher.Publish(zs.Receive);//向事件发行者订阅一个事件
    36            //事件发行者收到一个事件
    37            Pub.issu(); //收到事件后做出的处理
    38        }

    39    }

    40}

    41

    故事2:张三订阅《生活》杂志和李四订阅《生活》《电脑》2本杂志,一年后由于经济危机李四退订了《电脑》杂志

    首先我们定义事件发行者(Publisher)

     1class Publisher //出版社
     2    {
     3        public delegate void PubComputer(string magazineName); //事件所需的代理 委托是种类
     4        public delegate void PubLife(string magazineName);
     5        public event PubComputer OnPubComputer=null;//事件的声明
     6        public event PubLife OnPubLife=null;
     7        public void issuComputer() //触发电脑杂志发行事件的方法
     8        {
     9            if(OnPubComputer!=null)
    10            {
    11                Console.WriteLine("发行《电脑》杂志");
    12                OnPubComputer("《电脑》杂志"); //必须和事件代理参数一致
    13                Console.ReadLine();
    14            }

    15        }

    16        
    17        public void issuLife() 
    18        {
    19            if(OnPubLife!=null)
    20            {
    21                Console.WriteLine("发行《生活》杂志");
    22                OnPubLife("《生活》杂志");
    23                Console.ReadLine();
    24            }

    25        }

    26    }

    这里面有两个触发事件的方法issuComputer和issuLife;

    接着定义事件的订阅者(接受者)

     1class Subscriber //订阅者
     2    {
     3        private string name;
     4        public Subscriber(string name)
     5        {
     6            this.name=name;
     7        }

     8        public void Receive(string magazineName)//在事件订阅者中定义事件处理程序
     9        {
    10            Console.WriteLine(name+"已经收到了"+magazineName);
    11        }

    12    }

    Receive方法通过委托方式,在事件触发时自动执行

    最后我们就可以演义出版商(publisher)和订户(subcriber)之间的故事(story)了

     1class Story //故事发生在订阅者和出版社之间
     2    {
     3        static void Main()
     4        {
     5            Publisher Pub=new Publisher();
     6            Subscriber zs=new Subscriber("张三");
     7            Pub.OnPubLife+=new Publisher.PubLife(zs.Receive);//张三订阅生活杂志
     8            Subscriber ls=new Subscriber("李四");//李四也订阅了电脑、生活杂志
     9            Pub.OnPubComputer+=new Publisher.PubComputer(ls.Receive);
    10            Pub.OnPubLife+=new Publisher.PubLife(zs.Receive);
    11            Pub.issuComputer(); //收到事件后做出的处理
    12            Pub.issuLife();
    13            //一年后张三由于经济危机取消了《生活》杂志的订阅
    14            Console.WriteLine("一年后经济危机");
    15            Pub.OnPubLife-=new Publisher.PubLife(zs.Receive);
    16            Pub.issuComputer(); 
    17            Pub.issuLife();
    18        }

    19    }
    转载自:http://www.cnblogs.com/hemood/archive/2008/11/27/1342582.html#1385050
  • 相关阅读:
    TI DM3730 EBOOT分析(一)
    收费系统三层+抽象工厂+反射实例
    sql语句中的时间查询
    五线谱学习软件
    hdu1061Rightmost Digit(附20循环的规律解法和附快速幂简单原理)
    云计算安全指南
    linux 下orcale基本操作指令
    HDU/HDOJ 2102 A计划 广度优先搜索BFS
    网站优化策略之SEO必知的七大技巧
    SEO之四大要不得
  • 原文地址:https://www.cnblogs.com/cr7/p/1682852.html
Copyright © 2011-2022 走看看