zoukankan      html  css  js  c++  java
  • 观察者模式

    1.观察者模式是什么呢?

        观察者模式(有时又被称为发布-订阅Subscribe>模式、模型-视图View>模式、源-收听者Listener>模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实作事件处理系统。

      个人理解:观察者模式是一种思想,不需要人为的去关注观察者和被观察者之间是怎样联系的,实现了解耦,只需要对象去注册被观察者(Observerable)与观察者(Observer),然后被观察者去添加一个或者多个观察者,当被观察者发生变动就会立即通知所有的观察者。

    下面我们来列举一个小例子:

    比如猫来了,所有的老鼠都会跑,并会说XXX猫来了,快跑,我是XXX老鼠。

    第一步:创建一个猫类

     public class Cat   //通知者
    
    {
    
        public string Name{set;get;}  //猫的名字
    
        List<Rat> list=new List<Rat>();  //存储老鼠的集合

           //增加老鼠的方法    

         public void Add(Rat rat)      

          {            

           list.Add(rat);        

          }

            //删除老鼠的方法       

          public void Remove(Rat rat)     

          {            

            list.Remove(rat);     

          }

        public Cat()
    
        {
    
        }
    
        public Cat(string name)
    
        {
    
           thisName=name;
    
        }
    
        //定义一个猫叫的方法
    
       public void Shout()
    
        {
    
          Console.WriteLine("喵喵喵!!!");
    
          //判断当集合不为空时
    
           if(list!=null)
    
           {
    
              foreach(Rat item in list)
    
              {
    
                  itemRun();
    
              }
    
           }
    
        }
    
    }

    第二步:创建一个老鼠类

     

     public class Rat
    
       {
    
         public string Name{ set; get;} //老鼠的名字
    
         public Cat MyCat { set; get;}//数据类型是一个猫的变量
    
         public Rat()
    
         {
    
          }
    
         public Rat(string name,Cat cat)
    
         {
    
              this.Name=name;
    
              this.MyCat=cat;
    
          }
    
          //定义一个老鼠跑的方法
    
         public   void Run()
    
         {
    
              Console.WriteLine(MyCat.Name+"猫来了,快跑!我是"+Name+"鼠");
    
         }
    
       }

    第三步:创建一个测试类

     class  Program
    
    {
    
       static void Main(string[] args)
    
        {
    
           //先创建出一只猫
    
          Cat  cat=new Cat("Tom");
    
          //创建出第一只老鼠
    
          Rat rat1=new Rat("Jim",cat);
    
          Rat rat2=new Rat("TaoQi",cat);
    
          //把老鼠添加到集合中
    
          cat.Add(rat1);
    
          cat.Add(rat2);
    
         //调用猫叫的方法
    
          cat.Shout();
    
          Console.RadeKey();
    
         }
    
    
    }

    运行结果:

     

    这只是当有一个种类的观察者时,当我们有多个类的时候(比如:鸟,狗等等)我们就需要创建一个接口出来,创建它的实现类。

    这个时候就需要我们把有共同行为的提炼到接口内

    //1.创建一个接口

    public  interface IRunable   //
    
    {
    
        void  Run();
    
    }

    //2.创建一个抽象的Pet类

     

    public  abstract class  Pet
    
      {
    
          public abstract void Shout(); //抽象叫的方法
    
          List<IRunable> list=new List<IRunable>();
    
          public void  Add(IRunable irunable)
    
          {
    
              list.Add(irunable);
    
          }
    
           public  void Remove(IRunable irunable)
    
           {
    
             list.Remove(irunable);
    
           }
    
      }   

    //3.创建一个猫类的通知者

    public class Cat:Pet
    {
    
      public string Name{ set; get;} //猫的名字
    
      public Cat()
    
      {
    
      }
    
      public Cat(string name)
    
       {
    
         this.Name=name;
    
       }
    
      public override void Shout()
    
      {
    
         ConsoleWriteLine("喵喵喵!!!");
    
           if(list!=null)
    
           { 
    
             foreach(IRunable item in list)
    
              {
    
                    item.Run()
    
              }
           }
       }
    }

    //4.创建一个老鼠类的观察者

    public class Rat:IRunable
    
    {
    
       public string Name{ set; get;} //老鼠的名字
    
       public Cat MyCat{ set; get;}  
    
       public Rat()
    
       {
    
        }
    
       public Rat(string name,Cat cat)
    
       {
    
         this.Name=name;
    
         this.MyCat=cat;
    
       }
    
       public void Run()
    
       {
    
           Console.WriteLine(MyCat.Name+"猫来了,快跑!!我是老鼠"+Name);
    
        }
    
    }

    //创建一个鸟类的观察者

    public  calss Bird:IRunable
    
    {
    
      public string Name{ set; get;}  //鸟的名字
    
      public Cat MyCat{ set; get;}  
    
      public Bird()
    
      {
    
      }
    
      public Bird(string name,Cat cat)
    
      {
    
        this.Name=name;
    
        this.MyCat=cat;
    
       }
    
       public void Run()
    
       {
    
        Console.WriteLine(MyCat.Name+"猫来了,快跑!!我是小鸟"+Name);
    
       }
    
    }

    //6.创建测试类

    class Program
    
    {
    
       static void Main(string[] args)
    
       {
    
         //创建一只猫通知者
    
        Cat cat=new Cat("Tom");
    
        //创建一只老鼠的观察者
    
       Rat rat=new Rat("Jim",cat);
    
       //创建一只小鸟的观察者
    
        Bird bird=new Bird("DiDi",cat);
    
       //把观察者添加到集合中
    
        cat.Add(rat);
    
        cat.Add("bird");
    
        cat.Shout();
    
        Console.RaedKey();
    
    }

    运行结果:

    观察者模式的特点:
    1.一个主题可以有任意数量依赖他的观察者,一旦主题的状态发生改变,所有观察者都可以得到通知
    2.主题发出通知不需要知道具体观察者
    3.具体观察者也不需要知道其他观察者的存在

    但是:

    将一个系统分割成一系列相互作用的类有一个很不好的副作用,就是需要维护相关对象间的一致性,

    使得各个类紧密耦合,这样会给维护,扩展和重用都带来不便。

    应用时机:

    当一个对象的改变需要同时改变其他对象的时候使用观察模式 不知道具体有多少对象有待改变时,应考虑使用观察者模式 一个抽象模型有两个方面,其中一个方面依赖于另一个方面

     

  • 相关阅读:
    ESFramework介绍之(32)―― Tcp客户端核心组件关系图
    Java -- 在Eclipse上使用XFire开发WebService
    DTS开发记录(1)--系统总体结构
    ESFramewor使用技巧(3) -- 在插件中使用Spring.net
    DTS开发记录(序)
    给关注ESFramework的朋友们 2006.06.25
    ESFramework介绍之(34)―― ITcpServerAgent和IUdpServerAgent组件关系图
    Java -- 在Eclipse上使用Hibernate
    【C#2.0】点滴(不断补充中......)
    Java -- 在Eclipse上使用Spring
  • 原文地址:https://www.cnblogs.com/wl0000-03/p/6051166.html
Copyright © 2011-2022 走看看