`
devgis
  • 浏览: 133146 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

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

 
阅读更多

要求:

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

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

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

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

?
Public classCat
{
Public delegatevoidCrying(objectsender,EventArgs e);//定义一个猫叫委托
Public Event Crying cry;//定义猫叫事件
Public voidOnCry(EventArgs e)
{
If(cry!=null
{
Cry(this,e);
}
}
Public voidStartCrying()//猫叫、触发cry事件
{
MessageBox.Show("猫开始叫了......");
EventArgs e=newEventArgs();
OnCry(e);
}
}

?
Public classMouse
{
Public delegatevoidRuning(Object sender,EventArgs e);
Public evnet delegaterun;
Public voidOnRun(EventArgs e)
{
If(run!=null)
{
Run(this,e);
}
}
Public voidStartRuning(Cat c)
{
c.cry+=newCat.Crying(c_Cry);//注册了猫叫事件,老鼠听到猫叫则开始逃跑
}
Public voidc_Cry(objectsender,EvnetArgs e)//老鼠在逃跑时又触发了人被惊醒事件
{
MessageBox.Show("老鼠开始逃跑了........");
EventArgs e=newEventArgs();
OnRun(e);
}
}
Public classPerson
{
Public voidWaking(Mouse m)
{
m.run+=newMouse.Runing(m_run);//人注册了老鼠逃跑事件,老鼠逃跑时人被 惊醒
}
Public voidm_run(objectsender,EventArgs e)
{
MessageBox.Show("人醒了,What's wrong?");
}
}

?
BtnTest_Click(objectsender, EventArgs e)
{
Cat c=newCat();
Mouse m=newMouse();
Person p=newPerson();
c.StartCrying();
m.StartRunning(c);
p.Waking(m);
}

实验效果依次如下:

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

Observer(观察者模式)

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

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

?
Public classCat:Subject
{
ArrayList arrlyList;
Public Cat()
{
arrlyList=newArrayList();
}
Void AddObserver(Observer obj)//实现添加观察着对象的方法
{
arrlyList.Add(obj);
}
Void Cry()//猫叫了,并通知所有的观察者,作出相应的反应
{
MessageBox.Show("猫叫了......");
Foreach(Observer obj inarrlyList)
{
obj.Response();
}
}
}

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

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

?
Btn_Click(Object sender,EventArgs e)
{
Cat c=newCat();
Mouse m=newMouse(c);
People p=newPeople(c);
c.Cry();
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics