观察者模式

本文通过一个生动的例子介绍了观察者模式的实现方式。该模式定义了一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都会收到通知并自动更新。文章通过创建猫类(被观察者)和老鼠类(观察者),展示了如何利用C#中的事件和委托来实现这种模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义对象间一种一对多的依赖关系,使得当一个对象改变状态,则所有依赖于他的对象都会得到通知并被自动更新。

有三只动物,Tom猫,Jerry和Jack鼠,当猫叫的时候,触发事件CatShout,然后两只老鼠开始逃跑(MouseRun),我们使用观察者模式来实现


1、首先添加一个猫类,作为被观察者类,添加猫的属性和方法,并且在类中定义一个事件

/// <summary>
    /// 猫类(被观察者)
    /// </summary>
    class Cat
    {
        private string _name;
        private string _color;
        public Cat(string name, string color)
        {
            this._name = name;
            this._color = color;
        }
        /// <summary>
        /// 猫来了(被观察者的状态发生改变)
        /// </summary>

        public void Conming()
        {
            Console.WriteLine(_color + _name + "猫来了,喵喵喵~~~~");
            catCome?.Invoke();//如果catCome不等于空,则调用catCome方法
        }
        public event Action catCome;//定义一个事件,事件只能在类的内部触发,不能在类的外部调用,把委托改为事件,增加了代码的安全性
    }

2、添加一个老鼠类,作为观察者类,并且将观察者自身的方法注册进被观察者中定义的事件中

  class Mouse
    {
        private string _name;
        private string _color;
        public Mouse(string name,string color,Cat cat)
        {
            this._name = name;
            this._color = color;
            cat.catCome += RunAway;//把观察者自身的方法注册进被观察者的事件里面
        }

        public void RunAway()
        {
            Console.WriteLine("老猫来了"+_color + _name + "老鼠赶快跑,吱吱吱吱~~~");
        }
    }

3、在主函数中实例化观察者和被观察者

    class Program
    {
        static void Main(string[] args)
        {
            Cat cat = new Cat("加菲","黄色");
            Mouse mo = new Mouse("杰瑞", "黄色",cat);
          //  这样,不管新添加几个观察者,都不用修改被观察者中的代码。减少了代码出错的概率,清晰了代码结构.
            Mouse mo2 = new Mouse("米奇", "黑色",cat);
            Mouse mo3 = new Mouse("小二", "红色",cat);
           cat.Conming();
            Console.ReadKey();
        }
    }


事件和委托的联系和区别

1、事件是一种特殊的委托,或者说是受限制的委托,是委托的一种特殊应用,只能施加+=、-=操作符,两者在本质上是一个东西
2、event ActionHandler Tick;表示定义一个事件。关键字 事件类型 事件名 
3、 事件只允许用Add,Remove方法(即+=、-=)操作,这导致了他不允许在类的外部被直接触发,只能在类的内部适合的时机触发,这样增加了代码的安全性
3、使用时,委托常用来表达回调,事件表达外发的接口
4、委托和事件支持静态方法和成员方法


3、在主函数中实例化观察者和被观察者
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小温同学的账号

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值