经常看到有关猫,老鼠,主人的那个题目,这里我想说一下自己的一点想法
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();
}
}
这样就能保证,小老鼠和主人能观察到全部的猫的活动,还能知道是那只小猫叫了
但是也不是全部的都是这么处理
比如像自动取款机,取完款后,自动发送短信和邮件的,这种类型就需要用第一种方式,因为它只观察摸一个账号是否取款
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();
}
}
这样就能保证,小老鼠和主人能观察到全部的猫的活动,还能知道是那只小猫叫了
但是也不是全部的都是这么处理
比如像自动取款机,取完款后,自动发送短信和邮件的,这种类型就需要用第一种方式,因为它只观察摸一个账号是否取款
相关文章推荐
- 前两天刚看书看到的,来这里跟大家分享一下有关C#处理指令的问题
- 《影子跟随算法》目前试着自己写一个联网双人对战的小游戏 看到一篇网络同步的文章很受启发 这里记录一下
- 设计题:猫叫,老鼠逃跑,主人惊醒。在网上面看到很多不同的设计版本,自己也写一个,供讨论是否设计思路正确
- 一点想法,警告自己,提醒朋友
- Java单态模式的实现(笔试不会的题目,鄙视自己一下)
- 你的项目TDD了吗? 有关测试驱动开发的一点想法
- 个人做asp.net时犯过的错或是一点心得什么的(我就经常的更新一下吧)
- 关于本科学习GIS的一点感悟,不知道自己该干些什么的学弟学妹们可以借鉴一下……
- 做项目的一点自己的想法 在开发中我觉得可以修改的地方
- 自己在看到网上一些table数据导出excel,自己为自己记录一下以免以后需要
- 刚刚在看52单片机和GPS通信程序的时候,看到了一个函数,absacc.h,貌似从来没有遇到过,百度了一下,结合自己的理解,整理如下: http://blog.sina.com.cn/s/blog_4
- 企业中有关Server Sharing的一点想法
- 自己的一点想法(老师对我的指导)
- 有关allocator配置器的一点小总结,自己实现allocator类
- 来这里记录一下自己
- 学习Exadata时看到的一篇不错的文章,转一下,自己也备忘
- 说说自己最近的一点想法
- 有关2009年春晚的几个文章,另网站被百度收录,自己庆祝一下!
- 2005年国内各大公司的薪酬一览 --同学发给我的,留在这里刺激一下自己,不过他说到了中国工程物理研究院(四川绵阳) 对此不表同意,具体情况我可最清楚呀,哈哈
- 从国外某著名DNN 知情人士 Nina's Blog上看到一些有用的文章,在此记录一下,也为国内DNN,问题搜索,出一点力