问题
猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。
分析
从这句话,我们可以获得两个信息:
- 涉及到三个角色,猫,老鼠和主人。因此,显然要定义三个类Cat,Mouse和Master。至于这三个类之间的关系,看你如何选择实现的方式;
- 当猫发出一个动作时,老鼠和主人都会做出自己的反应。因此,第一个能够想到的实现方式是事件委托方式。但是设计模式中,有一个观察者模式,也能够达到这个要求。
解决方案
这样,或是用事件委托方式,或是用观察者模式。
方案一:观察者模式
public interface Observer
{ void Response();}
public interface Subject
{ void AimAt(Observer ob);}
public class Cat : Subject
{ private ArrayList _observers; public ArrayList Observers { get { return this._observers; } set { this._observers = value; }}
public Cat() {this.Observers = new ArrayList();
}
public void AimAt(Observer ob)
{ this.Observers.Add(ob);}
public void Cryed()
{ Console.WriteLine("Now, Cat Cryed!");foreach (Observer ob in this.Observers)
{ob.Response();
}
}
}
public class Mouse : Observer
{private string _name;
public string Name
{ get { return this._name; } set { this._name = value; }}
public Mouse(string name, Subject su)
{ this.Name = name; su.AimAt(this);}
public void Response()
{Console.WriteLine("Then, " + this.Name + " Attempt To Escape!");
}
}
public class Master : Observer
{ public Master(Subject su) { su.AimAt(this);}
public void Response()
{ Console.WriteLine("Then, Host Waken Up!");}
}
class Program{static void Main(string[] args)
{ Cat cat = new Cat();Mouse m1 = new Mouse("m1", cat);
Mouse m2 = new Mouse("m2", cat);
Master h = new Master(cat);cat.Cryed();
Console.ReadKey();
}
}
方案二:事件委托
public delegate void SubEventHandler();
public abstract class Subject
{public event SubEventHandler subEvent;
protected void OnFireAwayEventHandler()
{if (this.subEvent != null)
{ this.subEvent();}
}
}
public class Cat : Subject
{public void Cryed()
{ Console.WriteLine("Now, Cat Cryed!"); this.OnFireAwayEventHandler();}
}
public abstract class Observer
{ public Observer(Subject su) { su.subEvent += new SubEventHandler(Response);}
public abstract void Response();
}
public class Mouse : Observer
{private string _name;
public string Name
{ get { return this._name; } set { this._name = value; }}
public Mouse(string name, Subject su)
: base(su) { this.Name = name;}
public override void Response()
{Console.WriteLine("Then, " + this.Name + " Attempt To Escape!");
}
}
public class Master : Observer
{ public Master(Subject su) : base(su) { }public override void Response()
{ Console.WriteLine("Then, Host Waken Up!");}
}
class Program{static void Main(string[] args)
{ Cat cat = new Cat();Mouse m1 = new Mouse("m1", cat);
Mouse m2 = new Mouse("m2", cat);
Master h = new Master(cat);cat.Cryed();
Console.ReadKey();
}
}
都会得到相同的结果:
Now, Cat Cryed!
Then, m1 Attempt To E
Then, m2 Attempt To E
Then, Host Waken Up!