刚看了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) ;