您的位置:首页 > 其它

经常看到有关猫,老鼠,主人的那个题目,这里我想说一下自己的一点想法

2008-08-03 23:00 423 查看
经常在网上看到题目:有一只猫叫了,老鼠跑了,惊动了主人,网上看看到了到家都用了观察者模式,这个无可厚非,我先把网上的一其他网友的代码贴出来
public delegate void SubEventHandler();
public abstract class Subject
{
public event SubEventHandler SubEvent;
protected void FireAway()
{
if (this.SubEvent != null)
this.SubEvent();
}
}
public class Cat : Subject
{
public void Cry()
{
Console.WriteLine("cat cryed.");
this.FireAway();
}
}
public abstract class Observer
{
public Observer(Subject sub)
{
sub.SubEvent += new SubEventHandler(Response);
}
public abstract void Response();
}
public class Mouse : Observer
{
private string name;
public Mouse(string name, Subject sub)
: base(sub)
{
this.name = name;
}
public override void Response()
{
Console.WriteLine(name + " attempt to escape!");
}
}
public class Master : Observer
{
public Master(Subject sub) : base(sub) { }
public override void Response()
{
Console.WriteLine("host waken");
}
}
class Class1
{
static void Main(string[] args)
{
Cat cat = new Cat();
Mouse mouse1 = new Mouse("mouse1", cat);
Mouse mouse2 = new Mouse("mouse2", cat);
Master master = new Master(cat);
cat.Cry();
}
}
Mouse mouse1 = new Mouse("mouse1", cat);这句话可以看出mouse1只观察cat这只小猫,这样明显是不合理的,因为如果还有另外一只小猫叫了很明显老鼠是不会观察到的,也不会逃跑的,那么就要保证全局就只有一个委托,下面是我改的代码
public delegate void SubEventHandler(Cat cat);

public abstract class Subject
{
public static event SubEventHandler SubEvent;
public static void FireAway(Cat cat)
{
if (SubEvent != null)
SubEvent(cat);
}
}
public class Cat// : Subject
{
public string name;
public Cat(string Name)
{
this.name = Name;
}
public void Cry()
{
Console.WriteLine(this.name + " cryed.");
//this.FireAway();
Subject.FireAway(this);
}
}
public abstract class Observer
{
public Observer()
{
Subject.SubEvent += new SubEventHandler(Response);
}
public abstract void Response(Cat cat);
}
public class Mouse : Observer
{
//指出是那只猫惊动了我

private string name;
public Mouse(string name)
//: base(sub)
{
this.name = name;
//Subject.SubEvent += Response;
}
public override void Response( Cat cat)
{
Console.WriteLine( "名叫"+cat.name + "的猫,惊动了,名字为"+name+"的老鼠");
}
}
public class Master : Observer
{
//指出是那只猫惊动了我
public Master() //: base(sub)
{// Subject.SubEvent += Response;
}
public override void Response(Cat cat)
{
Console.WriteLine("名叫"+cat.name + "的猫,惊动了,主人");
}
}
class Class1
{
static void Main(string[] args)
{
Cat cat2 = new Cat("Join");
Cat cat = new Cat("花花");
Mouse mouse1 = new Mouse("mouse1");
Mouse mouse2 = new Mouse("mouse2");
Master master = new Master();
cat.Cry();
cat2.Cry();
for (int i = 0; i < 10; i++)
{
string catName= Console.ReadLine();
Cat cat3 = new Cat(catName);
Mouse mouseI = new Mouse("mouseI" + i.ToString());
cat3.Cry();
}
Console.ReadLine();

}
}

这样就能保证,小老鼠和主人能观察到全部的猫的活动,还能知道是那只小猫叫了
但是也不是全部的都是这么处理
比如像自动取款机,取完款后,自动发送短信和邮件的,这种类型就需要用第一种方式,因为它只观察摸一个账号是否取款
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐