经常在网上看到题目:有一只猫叫了,老鼠跑了,惊动了主人,网上看看到了到家都用了观察者模式,这个无可厚非,我先把网上的一其他网友的代码贴出来
Mouse mouse1 =
new
Mouse(
"mouse1"
, cat);这句话可以看出mouse1只观察cat这只小猫,这样明显是不合理的,因为如果还有另外一只小猫叫了很明显老鼠是不会观察到的,也不会逃跑的,那么就要保证全局就只有一个委托,下面是我改的代码
这样就能保证,小老鼠和主人能观察到全部的猫的活动,还能知道是那只小猫叫了
但是也不是全部的都是这么处理
比如像自动取款机,取完款后,自动发送短信和邮件的,这种类型就需要用第一种方式,因为它只观察摸一个账号是否取款
- 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();
- }
- }
- 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();
- }
- }
这样就能保证,小老鼠和主人能观察到全部的猫的活动,还能知道是那只小猫叫了
但是也不是全部的都是这么处理
比如像自动取款机,取完款后,自动发送短信和邮件的,这种类型就需要用第一种方式,因为它只观察摸一个账号是否取款