题目是这样的:猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。

要求:

1、要有联动性,老鼠和人的行为是被动的

2、考虑可扩展行,猫叫声可能会引起其他联动效应

看到这个程序设计题目,我的第一反应是用事件来解决,猫叫触发了事件,引起了老鼠的逃跑,老鼠逃跑又触发了事件导致主人被惊醒。所以按照这个思路,我做出了如下的解答。

首先,将猫、老鼠、和人分别抽象出来为三个类,分别为:Cat、Mouse、People。在Cat类中我们做如下处理:

public class Cat
{public delegate void Crying(object sender,EventArgs e);//定义一个猫叫委托public event Crying cry;//定义猫叫事件public void OnCry(EventArgs e){if(cry!=null){cry(this,e);}}public void StartCrying()//猫叫、触发cry事件{MessageBox.Show("猫开始叫了......");EventArgs e=new EventArgs();OnCry(e);}
}

public class Mouse
{public delegate void Runing(Object sender,EventArgs e);public evnet delegate run;public void OnRun(EventArgs e){if(run!=null){run(this,e); }}public void StartRuning(Cat c){c.cry+=new Cat.Crying(c_Cry);//注册了猫叫事件,老鼠听到猫叫则开始逃跑}public void c_Cry(object sender,EvnetArgs e)//老鼠在逃跑时又触发了人被惊醒事件{MessageBox.Show("老鼠开始逃跑了........");EventArgs e=new EventArgs();OnRun(e);}
}
public class Person
{public void Waking(Mouse m){m.run+=new Mouse.Runing(m_run);//人注册了老鼠逃跑事件,老鼠逃跑时人被 惊醒}public void m_run(object sender,EventArgs e){MessageBox.Show("人醒了,What's wrong?");}
}

BtnTest_Click(object sender, EventArgs e)
{Cat c=new Cat();Mouse m=new Mouse();Person p=new Person();m.StartRunning(c);p.Waking(m);c.StartCrying();
}

实验效果依次如下:

下面再通过另一个方式来解决这个问题。

Observer(观察者模式)

首先我们需要新建两个接口:

public interface Observer
{void Response();//对被观察对象的行为作出反应,这里是指猫叫
}
public interface Subject
{void AddObserver(Observer obj);//添加所有的观察者,在发生动作时对他们进行通知
}

public class Cat:Subject
{ArrayList arrlyList;public Cat(){arrlyList=new ArrayList();}void AddObserver(Observer obj)//实现添加观察着对象的方法{arrlyList.Add(obj);}void Cry()//猫叫了,并通知所有的观察者,作出相应的反应{MessageBox.Show("猫叫了......");foreach(Observer obj in arrlyList){obj.Response();}}
}

public class Mouse:Observer
{public Mouse(Cat c)//将当前的观察着对象添加到观察者集合中{c.AddObserver(this);}public void Response(){MessageBox.show("老鼠开始逃跑了.....");}
}

public class People:Observer
{public People(Cat c)//将当前的观察着对象添加到观察者集合中{c.AddOberver(this);}public void Respone(){MessageBox.Show("人醒了,What's Wrong?");}
}

Btn_Click(Object sender,EventArgs e){
Cat c=new Cat();
Mouse m=new Mouse(c);
People p=new People(c);
c.Cry();}

结果跟上边所示的一样。

好了,到这里这道程序设计题的解决方案也就是这些了,通过这两种不同的解决方案我们可以发现,在针对多个不同的观察者时,使用观察着实现联动性,比较方面,而且可扩展性也比较强,事实上观察者模式也就是主要用于对多个不同的观察者对象做出不同反应而设计的。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实作事件处理系统。

反观我们使用第一种方法事件订阅处理,可以实现多级的联动,猫叫引发老鼠跑,老鼠跑引发人醒,事件的存在是为了弥补委托的不足,事件是将事件发送者(触发事件的对象)与事件接受者(处理事件的方法)相关联的一种代理类,即事件机制是通过代理类来实现的。当一个事件被触发时,由该事件的代理来通知(调用)处理该事件的相应方法。事件多用于WinForm中的窗体的传递值,按钮的Click事件等。

这一节就到这里了,希望能给大家有所帮助,还请多多指导!

关于猫叫、老鼠逃跑、人被惊醒的程序设计相关推荐

  1. Java猫叫老鼠跑人惊醒_关于猫叫、老鼠逃跑、人被惊醒的程序设计

    题目是这样的:猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒. 要求: 1.要有联动性,老鼠和人的行为是被动的 2.考虑可扩展行,猫叫声可能会引起其他联动效应 看到这个程序设计题目,我的第一反应是用事件 ...

  2. Java猫叫老鼠跑人惊醒_面试题:猫叫、老鼠跑、人醒的一点看法

    这些天一直在面试中,做着不同的面试题,唉,悲催 上周做的一道面试题今天正好出现在园里的首页,看了一下这位同学的实现,基本上方向是对的,就是代码上细节没有注意,有一些错误,这里我就写一下我的理解 --- ...

  3. 猫叫,老鼠逃跑,主人惊醒--答案

    要点:1.   联动效果,运行代码只要执行Cat.Cryed()方法.2.   对老鼠和主人进行抽象   评分标准:   <1> .构造出Cat.Mouse.Master三个类,并能使程序 ...

  4. Java猫叫老鼠跑人惊醒_用代码表示如下情景:猫叫、老鼠逃跑、主人惊醒

    ### 1. 定义猫类型,并且该类型负责维护猫叫事件 *Cat.cs* ```csharp using System; namespace CatCry { /// /// 猫类型,维护猫叫事件 // ...

  5. 事件模拟场景:猫叫-老鼠逃跑 主人惊醒

    这是一个典型的观察者模式的应用场景,事件的发源在于猫叫这个动作,在猫叫之后,老鼠开始逃跑,而主人则会从睡梦中惊醒.可以发现,主人和老鼠这两个类型的动作相互之间没有联系,但都是由猫叫这一事件触发的. 设 ...

  6. C#面向对象试题一道,猫大叫,老鼠逃跑,主人惊醒。

    程序设计: 猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒.(C#语言) 要求:1.要有联动性,老鼠和主人的行为是被动的. 2.考虑可扩展性,猫的叫声可能引起其他联动效应. 答:方法一:  public ...

  7. 转-观察模式 猫叫鼠跑人醒

    转-观察模式 猫叫鼠跑人醒 猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒. public interface Observer     {         void Response();    // ...

  8. python实现猫抓老鼠

    猫和老鼠都是各位的童年回忆吧,相信各位没有人没看过吧,汤姆一直抓不到杰瑞,通过python来实现汤姆抓杰瑞吧 实现流程 首先实现游戏的步骤: 1.创建一个游戏场所 2.创造游戏角色 3.用键盘控制杰瑞 ...

  9. 薪酬管理故事——猫抓老鼠

    主人带着猫去屋子里抓老鼠,猫终于看到了一只老鼠,一直追赶它,追了很久仍没抓到.后来老鼠一拐弯,不知道跑到什么地方去了.主人看到这种情景,讥笑猫道:"大的反而抓不住小的?".猫回答说 ...

最新文章

  1. 用好这 42 款 Chrome 插件,每年轻松省出一个年假(附下载)
  2. mkdir创建递归目录
  3. java tcp read_【Java TCP/IP Socket】TCP Socket通信中由read返回值造成的的死锁问题(含代码)(转)...
  4. 东北大学计算机应用基础在线作业,东北大学计算机应用基础
  5. Html中的次方符号怎么写
  6. 整人之bat重启文件
  7. 浅谈Java网络编程之Socket (2)
  8. 第四范式携手宁德时代 共建智能制造AI新基础设施
  9. POJ - 2826 An Easy Problem?!(计算几何,好题)
  10. 电脑基础操作_苹果电脑基础操作,和使用须知
  11. android 代码写命令,monkey基本命令及脚本编写(示例代码)
  12. linux 编译 连接失败,编译linux-3.15.5时遇到的几个错误
  13. python多进程优化_python多进程提高cpu利用率
  14. chrome浏览器js 导出excel
  15. 如何用计算机设置闹铃,在win10系统下怎样设置电脑闹钟铃声?
  16. unity3d补间动画DoTween
  17. 计算2的N次方(C++)
  18. 悉尼大学 GC in Data Science 学习总结
  19. 智慧经营误区为何很多人还在执迷不悟?
  20. 微信PC端网站 微信扫码登陆

热门文章

  1. CDGA考试-2022年最新模拟题一套100道题(含答案)
  2. 卡尔曼滤波原理详解(二)
  3. 十种典型的数据结构及其特性
  4. 半包、全包、套餐、整装该如何选择?
  5. 国漫不再“跪日”后 崛起有望吗?
  6. 给初学者的精品学习资料,记得及时下载
  7. 经过笔试和多轮技术面试我居然败给了HR面?
  8. QEMU 7.0 发布
  9. 云易绘:原画师怎么才能找到自己的风格
  10. 小程序开发过程中常见问题[微信小程序、支付宝小程序]