C#delegate和event的关系 - chunlieater/chunlifeet GitHub Wiki

delegate可以看作是一种特殊的类,任何可以声明类的地方都可以声明委托,而event是一种特殊的delegate。

  • public delegate void GreetingDelegate(string name)
  • public class Chunli{
  • public GreetingDelegate del;
  • public event GreetingDelegate evn;
  • public void ChunliCall(string call){
  •   del(call);
    
  •   evn(call);
    
  • }
  • }
  • class Program{
  • private void Feet(string name){}
  • private void Ass(string name){}
  • private void Pussy(string name){}
  • static void Main{
  •    Chunli chunli = new Chunli();
    
  •    chunli.del = Feet;
    
  •    chunli.del += Ass;
    
  •    chunli.del += Pussy;
    
  •    chunli.evn = Feet;//编译错误!
    
  •    chunli.evn += Ass;
    
  •    chunli.evn += Pussy;
    
  •    chunli.ChunliCall("delicious!");
    
  • }
  • } 观察者模式: Observer设计模式是为了定义对象间的一种一对多的依赖关系,以便于当一个对象的状态改变时,其他依赖于它的对象会被自动告知并更新。Observer模式是一种松耦合的设计模式。

被观察者(Subject)就是结果的提供者,观察者(Observer)就是根据结果作出反应的类和函数。

  • //定义被观察者

  • public class Meat{

  • string name;

  • int temperature;

  • public Meat(string name){

  •   this.name = name;
    
  • }

  • }

  • public class Pot{

  • Meat meat;

  • public delegate void BoilHandler(int temperature);

  • public delegate void MeatHandler(string name);

  • public event BoilHandler boil;

  • public event MeatCallHandler meatCall;

  • public Pot(Meat meat){

  •   this.meat = meat;
    
  • }

  • public void BoilMeat(){

  •    for(i=0;i<=100;i++){
    
  •       meat .temperature = i;
    
  •       boil(meat .temperature);
    
  •       if(i>=95){
    
  •          meatCall(meat .name);
    
  •       }
    
  •    }
    
  • }

  • }

  • //定义观察者

  • public class Alarm{

  • public void alarm(int temperature){
    
  •     Console.WriteLine("Alarm:嘀嘀嘀,水已经 {0} 度了:", param);
    
  • }
    
  • }

  • public class Display{

  •  public static void display(string name){
    
  •     Console.WriteLine("Display:"+name+"快煮熟了!");
    
  • }
    
  • }

  • //执行

  • class Program{

  • Pot pot = new Pot(new Meat("Chunli"));

  • Alarm ala = new Alarm();

  • pot. BoilHandler += ala.alarm;

  • pot. MeatHandler += Display.display;

  • pot.BoilMeat();

  • }