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(); //猫叫了!然后老鼠跑了
    
           }
    }
    
    
    
    

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

  • 相关阅读:
    谁能撼动C语言的霸主地位?是Go?是Rust?还是...
    从入职到快速晋升,程序员能够从底层逆袭,究竟是什么原因?
    我敢说,这8个Linux基础命令,学了绝不吃亏!(强烈推荐)
    想从程序员到百万高管,你一定要避开这3个坑!(年轻人必读)
    注意!在Linux中删除特殊名称文件有这6种方式!(建议收藏)
    事实证明!这10个Linux系统操作指令,简直 “不讲武德” ,请大家耗子尾汁!
    最适合单片机编程的高级语言,除了C语言,别无选择!
    “Help”!如何学习C和C++才不茫然,才不是乱学?
    C语言丨不要阅读此文,除非你已掌握二叉树的这些操作
    团队编程项目作业2-团队编程项目开发环境搭建过程
  • 原文地址:https://www.cnblogs.com/laodada/p/12787486.html
Copyright © 2011-2022 走看看