题目是这样的:猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。
要求:
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