观察者模式
观察者模式
观察值模式:
一方发送通知,一个接受通知。接
受通知的一方称作观察值,发送通
知的一方叫做目标(subject)。
如警察埋伏小偷。小偷就是目标,他每次一露头,就会被警察发现。这样就需要警察事先知道那个人是小偷。
interface ISubject { void Add(IObserver observer); void Delete(IObserver observer); void Notify(); string State { get; set; } } interface IObserver { void Action(string state); } class Thief:ISubject { IList<IObserver> observers; public Thief() { observers = new List<IObserver>(); } /// <summary> /// 增加观察者 /// </summary> /// <param name="observer"></param> public void Add(IObserver observer) { observers.Add(observer); } /// <summary> /// 删除观察者 /// </summary> /// <param name="observer"></param> public void Delete(IObserver observer) { observers.Add(observer); } /// <summary> /// 发送通知 /// </summary> public void Notify() { foreach (var item in observers) { item.Action(this.State); } } private string state=string.Empty; public string State { get { return state; } set { state = value; } } } class Police1:IObserver { /// <summary> /// 收到通知的行动 /// </summary> /// <param name="state">通知的内容</param> public void Action(string state) { if (state=="thief") { //抓小偷 Console.WriteLine("抓小偷"); } else { //继续观察 } } } class TestObserver { public void Run() { ISubject thief1 = new Thief(); IObserver p1 = new Police1(); thief1.Add(p1); thief1.State = "thief"; thief1.Notify(); } }
观察者解决的问题是两边的耦合关系,使得他们都依赖于抽象,一边的变化不会影响另一边。