刚看了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说不安全?)。
事件则不可以在类的外部调用,这样使用时会报错。
还有很多与委托相关的概念:
- Action与Func委托
可以理解为系统帮我们封装好的两个委托类型。区别在于Action只能指向无返回值的方法,而Func委托只可指向有返回值的方法 - 多播委托
一个委托可以指向多个方法,此时将其称为多播委托。 - 匿名方法
匿名方法本质上也是一个方法,不过没有名字。简化了方法在委托的绑定。可以使用在任何有委托变量的地方。 - Lambda表达式
Lambda表达式同样也是为了简化代码。可以使用在任何有委托变量的地方。表达式格式如下:
Action<int, int> action = (x, y) => Console.WriteLine(x+y) ;