观察者模式(委托与事件)

    刚看了SIKI老师的视频,对这方面终于算清楚了一些。趁热记录下来。

    观察者模式,又称发布/订阅模式。有一个非常明了的例子,就是猫和老鼠。

    先上代码吧。。不知道说什么。

class Cat
    {
        public string name;
        public string color;
        public event Action action;
        public Cat(string name,string color)
        {
            this.name = name;
            this.color = color;
        }
        public void catCome()
        {
            Console.WriteLine("{0}的猫{1}进屋了,喵喵喵...",color,name);
            action?.Invoke();
        }
    }

    声明一个猫的类,猫有一个进屋的行为。当进屋时,需将这个事件发布出去(即运行事件)。

class Mouse
    {
        public string name;
        public Mouse(string name,Cat cat)
        {
            this.name = name;
            cat.action += mouseRun;
        }


        public void mouseRun()
        {
            Console.WriteLine("老鼠{0}:老猫来了,快跑啊!",name);
        }
    }
    声明了一个老鼠的类,此时将老鼠逃跑的行为添加到委托cat.action上,这一过程即为订阅。必须订阅后,当发布了猫进屋的消息后,老鼠才能触发逃跑的方法。
 
 
class Program
    {
        public delegate int my_Delegate(string first,string second);
        public event my_Delegate myDel;
        static void Main(string[] args)
        {
            Cat cat = new Cat("加菲", "金色");
            Mouse mouse1 = new Mouse("卢XY", cat);
            Mouse mouse2 = new Mouse("郭YY", cat);
            cat.catCome();            
        }
    }

    观察者模式与委托、事件关联性很强。n个观察者,1个被观察者。当被观察者触发相应事件后,观察者会触发一系列反应。委托就像一个或多个方法的快捷方式。启动委托后,会触发绑定的所有方法。

    事件则是一种特殊的委托,两者本质上是相同的。仅有的区别是在调用时稍有差别。

    委托可以在所声明类的外部调用,但是尽量别这样用(SIKI说不安全?)。

    事件则不可以在类的外部调用,这样使用时会报错。

    

    还有很多与委托相关的概念:

  1.     Action与Func委托
            可以理解为系统帮我们封装好的两个委托类型。区别在于Action只能指向无返回值的方法,而Func委托只可指向有返回值的方法
  2.     多播委托
           一个委托可以指向多个方法,此时将其称为多播委托。        
  3.     匿名方法
            匿名方法本质上也是一个方法,不过没有名字。简化了方法在委托的绑定。可以使用在任何有委托变量的地方。
  4.     Lambda表达式
              Lambda表达式同样也是为了简化代码。可以使用在任何有委托变量的地方。表达式格式如下:
Action<int, int> action = (x, y) => Console.WriteLine(x+y) ;

    



猜你喜欢

转载自blog.csdn.net/qq_40028144/article/details/80353050