大学IT网 - 最懂大学生的IT学习网站! QQ资料交流群:367606806
当前位置:大学IT网 > C#技巧 > 委托、Lambda表达式、事件系列06,使用Action实现观察者模式,体验委托和事件的区别

委托、Lambda表达式、事件系列06,使用Action实现观察者模式,体验委托和事件的区别

关键词:委托Lambda表达式事件  阅读(703) 赞(13)

[摘要]本文是对委托、Lambda表达式、事件系列06,使用Action实现观察者模式,体验委托和事件的区别的讲解,对学习C#编程技术有所帮助,与大家分享。

在"实现观察者模式(Observer Pattern)的2种方式"中,曾经通过接口的方式、委托与事件的方式实现过观察者模式。本篇体验使用Action实现此模式,并从中体验委托与事件的区别。

□ 使用Action实现观察者模式

就举一个足球场上的例子,当裁判吹响终场哨,胜队庆祝,失败队落寞。把裁判看作是被观察者,比赛中的两队看作是观察者。

裁判作为被观察者需要提供一个Action委托供观察者方法注册。

public class Referee

    {

        public Action DoSth;


        public void ISayGameOver()

        {

            Console.WriteLine("嘀嘀嘀......比赛结束了~~");

            DoSth();

        }

    }

胜利的队和失败的队拥有共同的基类。

public class Team

    {

        private string _name;


        public Team(string name)

        {

            _name = name;

        }


        public string Name

        {

            get { return _name; }

        }

    }

胜利队或失败队,作为观察者,必须有符合Referee中Action定义的方法。

public class WinTeam : Team

    {

        public WinTeam(string name) : base(name){}


        public void Celebrate()

        {

            Console.WriteLine("我们晋级了,好开心!");

        }

    }


    public class LoseTeam : Team

    {

        public LoseTeam(string name) : base(name){}


        public void WeAreSad()

        {

            Console.WriteLine("比赛输了,好伤心!");

        }

    }

客户端,先把失败队和胜利队的方法注册到Action变量,然后由被观察者的一个方法触发委托链和方法。

static void Main(string[] args)

        {

            Referee referee = new Referee();

            var winTeam = new WinTeam("胜利队");

            var loseTeam = new LoseTeam("失败队");


            //注册观察者

            referee.DoSth += winTeam.Celebrate;

            referee.DoSth += loseTeam.WeAreSad;


            //被观察者启动事件通知观察者

            referee.ISayGameOver();

        } 

16

□ 体验委托与事件的区别

现在,我们在客户端,在调用Referee的实例方法ISayGameOver之前,尝试把Referee的委托变量DoSth设置为null。

static void Main(string[] args)

        {

            Referee referee = new Referee();

            var winTeam = new WinTeam("胜利队");

            var loseTeam = new LoseTeam("失败队");


            //注册观察者

            referee.DoSth += winTeam.Celebrate;

            referee.DoSth += loseTeam.WeAreSad;

            referee.DoSth = null;


            //被观察者启动事件通知观察者

            referee.ISayGameOver();

        }

      17

可见,当把把Referee的委托变量DoSth设置为null后,所有注册的方法将得不到执行。

如果把Referee的委托变量DoSth修饰为事件。

 public class Referee

    {

        public event Action DoSth;


        public void ISayGameOver()

        {

            Console.WriteLine("嘀嘀嘀......比赛结束了~~");

            if (DoSth != null)

            {

                DoSth();

            }

            

        }

    }

18
可见,当把委托变量DoSth修饰为事件后,只能通过+=和-=注册、取消方法,不能通过=设置。

把referee.DoSth = null;注释掉,将不会报错。



相关评论