设计模式2——观察者模式(c#码)

设计模式——观察者模式(c#码)

1、观察者模式简介

1.1定义

  有时候也叫 发布/订阅模式,定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

​ 观察者模式在被观察者和观察者之间建立了一个抽象的耦合,被观察者并不知道任何一个具体的观察者,只是保存着抽象观察者的列表,每个具体观察者都符合一个抽象观察者的接口。

1.2 适用环境

当一个对象改变需要同时改变多个其他对象,而且他不知道具体有多少对象需要改变的时候,应该考虑使用观察者模式。

实现思路

实现方法不止一种,但这里仅写出event的实现方法

要用事件来实现,之所以不用委托实现观察者模式,是因为

  1. 用委托实现的观察者模式会导致耦合性很高。
  2. 如果一个委托不需要在其定义的类之外进行触发,那就将其转化为事件,保证它不会在不可知的情况下被触发。
  class Cat   //被观察者的类
      {
          private string catName;
          private string catColor { get; set; }
          public Cat(string name, string color)
          {
              this.catName = name;
              catColor = color;
         }


         public delegate void CatShoutEventHandler();//1
         public event CatShoutEventHandler CatShoutEvent;//2

         public void CatShout()//猫叫
         {
             Console.WriteLine(catColor+" 的猫 "+catName+" 过来了,喵!喵!喵!
");
             //猫叫时触发事件
             //猫叫时,如果CatShoutEvent中有登记事件(或者说是有订阅者),则执行该事件
             if (CatShoutEvent != null)
                 CatShoutEvent();//被观察者行动(猫叫)之后,调用该事件,使观察者产生反应;
         }
    }


     class Mouse//观察者的类
     {
         private string mouseName;
         private string mouseColor { get; set; }
         public Mouse(string name, string color)
         {
             this.mouseName = name;
             this.mouseColor = color;
         }

         public void MouseRun()//观察者的行动
         {
             Console.WriteLine(mouseColor + " 的老鼠 " + mouseName + " 说:"老猫来了,快跑!"  
我跑!!
我使劲跑!!
我加速使劲跑!!!
");
         }

     }
////////////////////////////////////////
class program  
{
            static void Main(string[] args)
        {

              Console.WriteLine("[场景说明]: 一个月明星稀的午夜,有两只老鼠在偷油吃

                                一只黑猫蹑手蹑脚的走了过来
");
              Mouse Jerry = new Mouse("Jerry", "白色");
              Tom.CatShoutEvent += new Cat.CatShoutEventHandler(Jerry.MouseRun);//登记or注册(事件的实例+=方法的引用)//可写成  Tom.CatShoutEvent +=Jerry.MouseRun;
                                
              Mouse Jack = new Mouse("Jack", "黄色");

              Cat Tom = new Cat("Tom", "黑色");//实例化了才有事件的存在
              Console.WriteLine("[场景说明]: 为了安全的偷油,登记了一个猫叫的事件
");

                                
             Tom.CatShoutEvent += new Cat.CatShoutEventHandler(Jerry.MouseRun);//登记or注册(事件的实例+=方法的引用)//可写成  Tom.CatShoutEvent +=Jerry.MouseRun;
             
             Tom.CatShoutEvent += new Cat.CatShoutEventHandler(Jack.MouseRun);


              
             Tom.CatShout(); //猫叫了!然后老鼠跑了

       }
}



------------恢复内容结束------------

原文地址:https://www.cnblogs.com/laodada/p/12787486.html