观察者模式:解决一个对象的某个事件在发生后,触发一系列其他对象的动作。并且不希望对象之间存在紧密的依赖关系。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
static void Main(string[] args) { Chicken ck = new Chicken(); ck.Woo();//没使用观察者模式的方法。 } public class Chicken { public void Woo() { Console.WriteLine("先是鸡叫!"); //Woo方法调用之后,需要执行另外3个类中的3个方法。 new Father().Razor(); new Brother().Turn(); new Baby().Cry(); //这种方式带有强烈的入侵感,当Father、Brother、Baby中任意一个类发生变化,那么Woo方法就要发生变化。 } }
interface IObserver { void Action(); } public class Father : IObserver { public void Action() { this.Razor(); } public void Razor() { Console.WriteLine("{0} Razor", this.GetType().Name); } } public class Brother : IObserver { public void Action() { this.Turn(); } public void Turn() { Console.WriteLine("{0} Turn", this.GetType().Name); } } public class Baby:IObserver { public void Action() { this.Cry(); } public void Cry() { Console.WriteLine("{0} Cry",this.GetType().Name); } } public class Chicken { //使用观察者模式 //1、IObserver接口,然后让Father、Brother、Baby继承接口,并在类中实现IObserver接口中的Action方法,让Action方法去调用Razor,Trun和Cry方法 //2、在Chicken中声明一个对象队列(列表),再循环这个列表去执行。 private List<IObserver> _ObserverList = new List<IObserver>(); public void AddObserver(IObserver observer) { this._ObserverList.Add(observer); } public void WooObserver() { Console.WriteLine("先是鸡叫!", this.GetType().Name); if (this._ObserverList.Count > 0) { foreach (var item in _ObserverList) { item.Action(); } } } } static void Main(string[] args) { //使用观察者模式 Chicken ck1 = new Chicken(); ck1.AddObserver(new Father()); ck1.AddObserver(new Brother()); ck1.AddObserver(new Baby()); ck1.WooObserver(); }
使用C#中的委托来实现观察者模式,需要方法的参数列表和返回值相同。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class Father //: IObserver { //public void Action() //{ // this.Razor(); //} public void Razor() { Console.WriteLine("{0} Razor", this.GetType().Name); } } public class Brother //: IObserver { //public void Action() //{ // this.Turn(); //} public void Turn() { Console.WriteLine("{0} Turn", this.GetType().Name); } } public class Baby//:IObserver { //public void Action() { // this.Cry(); //} public void Cry() { Console.WriteLine("{0} Cry", this.GetType().Name); } } public class Chicken { //在C#中使用event来实现。 public event Action WooHandler; public void WooEvent() { Console.WriteLine("先是鸡叫!", this.GetType().Name); if (WooHandler != null) { foreach (Action action in this.WooHandler.GetInvocationList()) { action.Invoke(); } //也可以使用this.WooHandler.Invoke();来替代for循环 } } } static void Main(string[] args) { //使用委托 Chicken ck2 = new Chicken(); ck2.WooHandler += new Action(new Father().Razor); ck2.WooHandler += new Brother().Turn; ck2.WooHandler += new Baby().Cry; ck2.WooEvent(); Console.ReadKey(); }