观察者模式实现猫喊鼠跑人骂---用笨办法理解观察者模式

本文介绍如何使用C#中的观察者模式实现一个简单的“猫叫鼠跑人骂”的场景。通过定义猫作为被观察者,老鼠和人作为观察者,并实现各自的响应行为,展示观察者模式的基本原理。

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

温故而知新

用观察者模式实现C#经典题目  猫叫鼠跑人骂

        什么是设计模式里的观察者模式?我观察到楼下有西瓜卖,于是我就下楼买。同时也观察到楼下有西瓜卖,于是也下楼买西瓜。那么我和同事都是观察者,西瓜摊就是被观察对象。我们之间的关系就是通过观察(看到)就买。所以观察者模式有两种对象,观察者和被观察的对象。

        回到题目,猫叫老鼠跑人骂。就相当于人和老鼠在观察猫喊的行为,只要猫一喊,老鼠就跑,只要猫一喊,人就骂。即老鼠和人是观察者,猫是被观察者。猫的动作是喊,老鼠的反应是跑,人的反应是骂,那么人和老鼠根据猫的动作都有反应,所以把反应response提取出来。

那么我们当前可以大概有个思路:

猫类                        老鼠类:I反应                    人:I反应                            interface 观察者的反应

{                              {                                         {                                           {

喊(){}                        跑(){}                              骂(){}                                  response();

                     

}                               }                                         }                                              }

-------------------------------------------------------------------------------------------------------------------------------------

猫叫鼠跑人骂直接如何关联呢?通过List<I反应>,由于都是观察猫才有相应的反应,所以把List<反应>放入猫类里,只要猫叫,就循环把人和老鼠的List<反应> 显示出来即可实现猫叫老鼠跑人骂的观察后做出反应的效果。

所以猫类要加入List<反应>:

猫类{ List<反应> observe;喊(){} },同时老鼠和人也在实例化时把自身加入到猫类的List<反应> 里。所以猫类还应该有个加入(注册)的方法让老鼠和人加入(注册)到List。那么我们可以得到第二版代码

猫类                        老鼠类:I反应                    人:I反应                            interface 观察者的反应

{                              {                                         {                                           {

List<I反应> 反应;      实例化(观察猫 cat)                      实例化(观察猫 cat)

                                   {                                               {

                                      cat.添加反应(I反应);             添加反应(I反应);

                                    }                                              }                  

添加反应(I反应)

{

     List.Add(I反应);

}

喊(){                        跑(){}                              骂(){}                                  response();

    猫:喵喵喵;           

   foreach(List)

    {显示反应情况}   

   }             

}                               }                                         }                                              }

===================================================================================

基本是这个样子了,为了抽象,更实用,可能不是猫,是狗喊呢?人和老鼠也会有反应,所以我们应该把人和老鼠观察者猫添加(实例化)反应也抽象为接口,那么最后代码就是 多了一个被观察者(主体)的接口,ISubject;接口里的方法为加入(注册)老鼠,人的反应进反应列表。老鼠和人实例化 不在是(猫)而是主体接口 ISubject

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值