一,什么是观察者模式(Observer Pattern)?
当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象
二,代码如下:
在一开始我们先定义两个类,一个是Chinese类(被观察者) ,另一个是Jan类(观察者),观察者设计模式是当被观察者状态发生改变,从而触发观察者的事件
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _16.观察者模式 { /// <summary> /// 当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象 /// </summary> class Program { static void Main(string[] args) { Chinese ch = new Chinese("拿着棍子", "穿白色衣服的"); ch.AddObserver(new Jan("灰衣服")); ch.AddObserver(new Jan("白衣服")); ch.Coming(); //当中国人的状态发生改变,从而触发观察者绑定在中国人身上的事件(Coming) Console.ReadKey(); } } /// <summary> /// 观察者接口行为 /// </summary> public interface IObserver { void Action(); } /// <summary> /// 被观察者 /// </summary> public class Chinese { private string name; private string color; public Chinese(string name, string color) { this.name = name; this.color = color; } /// <summary> /// 观察者列表 /// </summary> private List<IObserver> _ObserverList = new List<IObserver>(); #region 操作 public void AddObserver(IObserver observer) { this._ObserverList.Add(observer); } public void RemoveObserver(IObserver observer) { this._ObserverList.Remove(observer); } #endregion /// <summary> /// 中国人过来(中国人的状态发生改变)(被观察者的状态发生改变) /// 列表进行通知 /// </summary> public void Coming() { Console.WriteLine(color + "的中国人" + name + "过来了 ..."); //一系列后续动作 foreach (var observer in this._ObserverList) { observer.Action(); } } } /// <summary> /// 集体观察者 /// </summary> class Jan : IObserver { private string color; public Jan(string color) { this.color = color; } public void Action() { Console.WriteLine(color + "的日本人说:赶紧跑"); } } }
三,观察者模式的核心是使用Action将观察者事件绑定到被观察者中,这样我们就可以通过观察者时间异步通知被观察者