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

要求:

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 Running run;

public void OnRun(EventArgs e)

{

if(run!=null)

{

run(this,e);

}

}

public Mouse(Cat c)

{

c.cry+=new Cat.Crying(c_Cry);//注册了猫叫事件,老鼠听到猫叫则开始逃跑

}

void c_Cry(object sender,EvnetArgs e)//老鼠在逃跑时又触发了人被惊醒事件

{

MessageBox.Show("老鼠开始逃跑了........");

EventArgs e=new EventArgs();

OnRun(e);

}

}

public class Person

{

public Person(Mouse m)

{

m.run+=new Mouse.Runing(m_run);//人注册了老鼠逃跑事件,老鼠逃跑时人被 惊醒

}

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(c);

Person p=new Person(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();

}

来自:http://www.cnblogs.com/Olive116/archive/2012/11/12/2765934.html

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

  1. 小新air15为啥没人买_小新air15为啥没人买

    展开全部 配置看起来很厉害但细查却不尽人意.配置不错32313133353236313431303231363533e4b893e5b19e31333433653938跑分不错,但用起来的表现却不是该 ...

  2. 三人表决器_数电小实验之三人表决器

    数电小实验 20级会员们的模电实验已经结束了,他们的培训计划已经从模电实验进行到了数电实验.他们将学习到一个新的知识--逻辑电路. 接下来让我们一起深入了解本次任务吧! 实验:三人表决器的设计和搭建 ...

  3. 微软电脑适合什么人用_眼膜适合什么年龄段的人使用呢?什么年龄段的人用什么样的眼膜...

    很多女人为了保护自己的眼周肌肤都会使用眼膜,不过呢眼膜可不是适合所有人使用的,那么眼膜适合什么年龄段的人使用呢? 18岁以上可以用补水型眼膜 过了十八岁以后的朋友们可以开始用一些眼膜了,但最好选补水型 ...

  4. python老鼠打洞问题_内网渗透-老鼠打洞之SSH隧道

    1. SSH隧道优势 (1)在内网中几乎所有得Linux/Unix服务器或个人机器都支持SSH协议,在使用的过程中可直接使用内网主机自带的SSH服务,不必再重新上传其他软件或者依赖,减少了被管理员发现 ...

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

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

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

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

  7. 观察者模式和委托实现 - 老鼠跑,猫叫,人醒

    老鼠跑,猫叫,人醒是典型的事件联动,解决此种情形,可以利用观察者模式或者事件委托来实现.利用设计模式时要考虑耦合,但利用事件委托的话,就不需要了.因为用委托的话,理解比较容易,这里没有单写,而是将委托 ...

  8. java猫抓老鼠_用猫抓老鼠的实例理解java中面向对象的编程与类和对象以及方法的概念...

    今天看到马士兵讲的关于面向对象编程的思路,用了一个猫抓老鼠的例子,我觉得这个例子非常形象,于是写在这里,方便学习理解和以后查看 class cat{ //声明一个类–"猫" int ...

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

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

最新文章

  1. js词法作用域(静态作用域)
  2. codeforces 962E Byteland, Berland and Disputed Cities 最小生成树变形
  3. C语言malloc和calloc的区别
  4. nginx服务无法启动,启动时报错1067以外终止
  5. Java:根据字节数截取字符串,但是汉字不能截取半个。
  6. c语言实验交换字母,新C语言实验学生版
  7. cakephp2.0 Utility class 简介
  8. Eclipse .class文件中文乱码
  9. demo10 关于JS Tree Shaking
  10. 第012讲 盒子模型经典应用
  11. U盘_PE启动+U存储+kali三合一启动盘制作教程
  12. Python词云库wordcloud 显示中文 !!!
  13. Windows强制关机之后,自动修复失败,无法开机的问题解决
  14. Linux ARM平台开发系列讲解(摄像头V4L2子系统) 2.12.5 V4L2 control的原理和实现
  15. Windows10搭建外网可访问的ftp服务器
  16. 使用SubstanceDesign和Unity插件ShaderForge制作风格化火焰
  17. pcl点云特征提取 法线估计 PFH FPFH NARF 惯量偏心矩 RoPs特征 视点特征直方图VFH GASD特征
  18. Centos安装rebar3
  19. 为什么更多企业会选择零代码开发平台?它的魅力在哪?
  20. 继承和多态(Java程序设计)

热门文章

  1. Verilog HDL 语言基础
  2. iOS10.1.1越狱插件推荐——DarkAppleStore
  3. java中负数取余数_数学 - java如何用负数进行模数计算?
  4. [机缘参悟-27]:鬼谷子-反应篇-反说之术,以毒攻毒,以错推错
  5. 计算机病毒近年相似,计算机病毒入侵检测与防治研究 毕业论文
  6. Selenium获取虎牙直播英雄联盟分区相关信息
  7. 小米路由器3连接校园网(哆点)
  8. vsftpd基于mysql_vsftpd的基于pam_mysql的虚拟用户配置示例
  9. 计算机辅助教学设计,计算机辅助教学设计介绍
  10. cocos creator 3d 3.0《懒猫跑酷》 实战开发教程