要求:
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();
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();
}
|