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

要求:

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

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

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

首先,将猫、老鼠、和人分别抽象出来为三个类,分别为:CatMousePeople。在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();
c.StartCrying();
m.StartRunning(c);
p.Waking(m);
}

实验效果依次如下:

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

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();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值