定义:对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。
观察者模式包括以下4个对象:
Subject(观察目标):被观察的对象。在目标中定义了一个观察者集合,它提供一系列方法来增加和删除观察者对象,同时它定义了通知方法notify()。目标类可以是接口,也可以是抽象类或具体类。
ConcreteSubject(具体目标):是目标类的子类,通常它包含有经常发生改变的数据,当它的状态发生改变时,向它的各个观察者发出通知。
Observer(抽象观察者):将对观察目标的改变做出反应,观察者一般定义为接口,该接口声明了更新数据的方法update()。
ConcreteObserver(具体观察者):维护一个指向具体目标对象的引用,它存储具体观察者的有关状态,这些状态需要和具体目标的状态保持一致;它实现了在抽象观察者Observer中定义的update()方法。
举例
猫叫,狗听到猫叫也叫,老鼠听到猫叫就跑
- 观察目标
public abstract class Subject{
protected List<Observer> observers = new List<Observer>();//注册方法
public void Attach(Observer Observer)
{
observers.Add(Observer);
}//注销方法
public void Detach(Observer Observer)
{
observers.Remove(Observer);
}//具体目标行动
public abstract void Notify();
}
- 具体目标(猫)
public class CatSubject : Subject
{
public override void Notify()
{
Console.WriteLine("猫叫");foreach(Observer c in observers)
{
c.Updata();
}
}
}
- 抽象观察者(听到猫叫有反应的对象)
public abstract class Observer
{
//观察者的应激反应
public abstract void Updata();
}
- 具体观察者(狗、老鼠)
public class DogObserver : Observer
{
//听到猫叫的反应
public override void Updata()
{
Console.WriteLine("狗也叫");
}
}
public class MouseObserver : Observer
{
public override void Updata()
{
Console.WriteLine("老鼠跑");
}
}
总结:观察目标类中,声明(并实现)观察者的增减方法和通知,具体目标类中实现通知方法(即通知的内容),抽象观察者中声明,具体观察者中实现收到通知后执行的方法。
ps:观察目标类和具体目标类中的通用方法,在哪实现都可以,具体目标状态改变和通知最好在具体目标类中实现