转自:C# 委托和事件 与 观察者模式(发布-订阅模式)讲解 by天命 - 天天天命 - 博客园
委托:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp2
{
class Program
{
static void Main(string[] args)
{
#region 这种方式:Cat 同时依赖Rat和指定的方法
Cat cat = new Cat();
Rat rat1 = new Rat("Jerry");
Rat rat2 = new Rat("TaoQi");
cat._whichObjectAndMethods += rat1.Run;//指定rat和它的run方法
cat._whichObjectAndMethods += rat2.Run;//指定rat和它的run方法
#endregion
#region 这种方式:Cat 只是依赖Rat,不依赖Rat的方法
//Cat cat = new Cat();
//Rat rat1 = new Rat("Jerry");
//Rat rat2 = new Rat("TaoQi");
//cat.rat1 = rat1;
//cat.rat2 = rat2;
#endregion
//调用cat的Shout方法
cat.Shout();
Console.ReadKey();
}
}
//定义一个委托 whichObjectAndMethods 没有返回值 参数列表为空
public delegate void whichObjectAndMethods();
//猫类
public class Cat {
public Cat() {
}
//委托:同时依赖类和方法
public whichObjectAndMethods _whichObjectAndMethods { set; get; }
//非委托:仅仅依赖类
//public Rat rat1 { set; get; }
//public Rat rat2 { set; get; }
public void Shout()
{
Console.WriteLine("喵喵喵");
_whichObjectAndMethods();//这里调用之前指定的所有方法
//rat1.Run();
//rat2.Run();
//rat1.other("a");//非委托时,可以调用其他方法
//rat2.other("b");//非委托时,可以调用其他方法
}
}
//老鼠类
public class Rat
{
public string Name { get; set; } //老鼠的名字
//老鼠的逃跑方法
public void Run()
{
Console.WriteLine(Name + "跑了!");
}
public void other(string p) {
Console.WriteLine(Name + "接收到的参数是:!"+p);
}
//无参和带参构造
public Rat() { }
public Rat(string name)
{
this.Name = name;
}
}
}
事件:
using System;
/// <summary>
/// 需要向被触发的类传递什么数据,可以写在这里
/// </summary>
public class CatShoutEventArgs : EventArgs
{
public string CatName { get; set; }
public CatShoutEventArgs(string name)
{
this.CatName = name;
}
}
public delegate void CatShoutEventHandler
(object sender, CatShoutEventArgs e);
//猫类
public class Cat
{
public string Name { get; set; } //猫的名字
/*好像有没有event关键字都是一样的*/
public event CatShoutEventHandler whichclassAndEvents;
public void Shout()
{
Console.WriteLine("喵喵喵");
//判断委托内是否为空,若不为空,执行该委托
if (whichclassAndEvents != null)
{
//new一个CatShoutEventArgs类,传入参数是自身的Name
CatShoutEventArgs e = new CatShoutEventArgs(Name);
//执行CatShout事件,传入自身和e
whichclassAndEvents(this, e);
}
}
//无参和带参构造
public Cat() { }
public Cat(string name)
{
this.Name = name;
}
}
//老鼠类
public class Rat
{
public string Name { get; set; } //老鼠的名字
//sender指调用run事件方法的类,这里例子是Cat,
//事件跟委托的区别是事件可以知道是谁调用了方法,但是单纯的委托是不知道的。
//比如听到声音,事件的方式,老鼠可以知道是猫发出来的,还是老虎发出来的,
//单纯的委托是不知道谁发出的
public void Run(object sender, CatShoutEventArgs e)
{
var aa = sender.GetType();//可以通过反射的方式知道是谁触发了该事件
//打出一句话,包括了猫的名字和老鼠的名字
Console.WriteLine(e.CatName + "来了! " + Name + "跑了!");
}
//无参和带参构造
public Rat() { }
public Rat(string name)
{
this.Name = name;
}
}
class EventTest7
{
static void Main(string[] args)
{
//构建一个猫对象和两个老鼠对象
Cat cat = new Cat("Tom");
Rat rat1 = new Rat("Jerry");
Rat rat2 = new Rat("TaoQi");
//向cat的委托对象CatShout中依次添加老鼠对象的Run方法
//注!!添加的是整个方法 不需要加括号
cat.whichclassAndEvents += rat1.Run;
cat.whichclassAndEvents += rat2.Run;
//调用cat的Shout方法
cat.Shout();
Console.ReadKey();
}
}
比如客人点菜了,厨房的人看到单据,有的员工洗菜,有的员工切菜,有的员工炒菜,,,,