zoukankan      html  css  js  c++  java
  • 设计模式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(); //猫叫了!然后老鼠跑了
    
           }
    }
    
    
    
    

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

  • 相关阅读:
    Chapter 4: Using Custom Property Types
    Chapter 2: Connecting to C++ Methods and Signals
    C++ Extensions: Reference examples
    qt exec
    qt component desktop
    Qt事件处理机制
    Tutorial: Writing QML Extensions with C++
    label for
    (一) HTTP 1.1支持的状态代码
    一些常用的特殊字符
  • 原文地址:https://www.cnblogs.com/laodada/p/12787486.html
Copyright © 2011-2022 走看看