观察者模式

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.具体观察者也不需要知道其他观察者的存在

但是:

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

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

应用时机:

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

相关推荐

  1. 观察模式 Observer

    2023-12-07 08:34:03       42 阅读
  2. 观察模式学习

    2023-12-07 08:34:03       35 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-07 08:34:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-07 08:34:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-07 08:34:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-07 08:34:03       20 阅读

热门阅读

  1. [leetcode 差分数组] 拼车 M

    2023-12-07 08:34:03       35 阅读
  2. ElasticSearch 查询优化手段有哪些?

    2023-12-07 08:34:03       31 阅读
  3. 持续集成部署-k8s-高级调度-亲和力

    2023-12-07 08:34:03       28 阅读
  4. 图论|841钥匙和房间

    2023-12-07 08:34:03       41 阅读
  5. 安全众测-内网渗透常用的工具和命令

    2023-12-07 08:34:03       41 阅读
  6. Android 消息分发机制解读

    2023-12-07 08:34:03       28 阅读
  7. html css样式选择器介绍

    2023-12-07 08:34:03       39 阅读
  8. vue 学习 -- day39(reactive 对比 ref)

    2023-12-07 08:34:03       36 阅读
  9. 一个小问题

    2023-12-07 08:34:03       37 阅读
  10. CSS 如何居中 DIV

    2023-12-07 08:34:03       41 阅读
  11. C++之链表list

    2023-12-07 08:34:03       28 阅读