观察者模式又称为发布订阅模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够够自动更新自己.
观察者模式结构图:
Subject实现代码:
using System;
namespace ConsoleApplication2
{
abstract class Subject
{
private IList<Observer> observers = new List<Observer>();
public void Attach(Observer observer)
{
observers.Add(observer);
}
public void Detach(Observer observer)
{
observers.Remove(observer);
}
public void Notify()
{
foreach (Observer observer in observers)
{
observer.Update();
}
}
}
}
ConcreteSubject实现代码:
using System;
namespace ConsoleApplication2
{
class ConcreteSubject:Subject
{
private string subjectState;
public string SubjectState
{
get;
set;
}
}
}
Observer实现代码:
using System;
namespace ConsoleApplication2
{
abstract class Observer
{
public abstract void Update();
}
}
ConcreteObserver实现代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication2
{
class ConcreteObserver:Observer
{
private string name;
private string observerState;
private ConcreteSubject subject;
public ConcreteObserver(ConcreteSubject subject,string name)
{
this.name = name;
this.subject = subject;
}
public override void Update()
{
observerState = subject.SubjectState;
Console.WriteLine("观?察¨¬者?{0}的Ì?最Á?新?状Á¡ä态¬?是º?{1}", name, observerState);
}
public ConcreteSubject Subject
{
get;
set;
}
}
}
将一个系统分割成一系列相互协作的类有一个很不好的副作用,那就是需要维护相关对象间的一致性,我们不希望为了维持一致性而是各类紧密耦合,这样会给维护、扩展和重用都带来不便;
而观察者模式的关键对象是主题subject和观察者Observer,一个subject可以由任意数目的依赖它的Observer,一旦Subject的状态发生了改变,所有的Observer都可以得到通知。Subject发出通知时并不需要谁是他的观察者,也就是说,具体观察者是谁,他根本不需要知道,而任何一个不知道也不需要知道其他观察者是谁;