定义
观察者模式(Observer Pattern): 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
C#例子
public interface ISubject {
void AddObserver(Observer observer);
void DeleteObserver(Observer observer);
}
public class Subject: ISubject
{
private IList<Observer> _observers = new List<Observer>();
private int _qantity;
public int Qantity
{
get
{
return _qantity;
}
set
{
_qantity = value;
this.NotifyAllObservers();
}
}
public void AddObserver(Observer observer) {
_observers.Add(observer);
}
public void DeleteObserver(Observer observer)
{
_observers.Remove(observer);
}
private void NotifyAllObservers() {
foreach (var observer in _observers) {
observer.Update();
}
}
}
public abstract class Observer
{
protected Subject _subject;
public abstract void Update();
}
public class ObserverA : Observer
{
public override void Update()
{
Console.WriteLine("我是A,我知道你的数量改变了!");
}
}
public class ObserverB : Observer
{
public ObserverB(Subject subject)
{
_subject = subject;
}
public override void Update()
{
Console.WriteLine("我是B,我知道你的数量改变成了"+_subject.Qantity);
}
}
static void Main(string[] args)
{
Subject subject = new Subject();
subject.AddObserver(new ObserverA());
subject.AddObserver(new ObserverB(subject));
subject.Qantity = 10;
Console.ReadLine();
}
观察者模式参与者:
- ISubject: 抽象的主题,被观察的对象,提供Attach和Detach Observer对象的接口
- Subject: 具体的被观察对象,维持Subject状态。 当状态发生变化时,发送消息通知它的观察者。
- Observer:抽象的观察者,定义一个发送变化通知更新的接口。
- Observer*: 维持一个对Subject对象的引用, 保存subjects状态,实现当Observer接口发生变动时,subjects状态同步更新。
观察者模式适用情形:
当一个抽象模型有两个方面,其中一方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
当对一个对象的改变需要同时改变其他对象,而不需要知道具体有多少对象有待改变。
当一个对象必须通知其他对象,而它又不需要知道其它的通知对象是谁,那些其它对象是谁不影响它发送通知这件事。
观察者模式特点:
- 使用面向对象的抽象,Observer模式使得可以独立地改变目标与观察者,从而使二者之间的依赖关系达到松耦合。
- 目标发送通知时,无需指定观察者,通知会自动传播。观察者自己决定是否需要订阅通知。
- 在C#中的Event。委托充当了Observer接口,而提供事件的对象充当了目标对象,委托是比抽象Observer接口更为松耦合的设计。
其他
源码地址
其他设计模式